一、安装:
上传到hadoop集群的某一个节点上,将sqoop压缩包解压即可直接使用;
二、配置:
将需要连接的数据库(比如Oracle、MySQL)的连接驱动拷贝到 sqoop目录的lib里;
三、配置mysql远程连接
GRANT ALL PRIVILEGES ON ekp_11.* TO ‘root‘@‘192.168.1.10‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION;
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘123456‘ WITH GRANT OPTION;
FLUSH PRIVILEGES
四、使用:
第一类:关系型数据库中的数据导入到HDFS上
1.1使用默认输出路径、指定导出的字段、设置map数量为1:
./sqoop import --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456 --table job_log --columns ‘fd_id, fd_start_time, fd_end_time, fd_subject,fd_success‘ -m 1
执行成功后,会在hdfs的/user/目录下会根据操作的用户名自动生成同名的root目录,root 目录下会生成同表名的job_log 目录,在job_log 目录下就是真正的导入到hdfs的数据文件。如下图:
1.2指定输出路径、指定数据导入后的分隔符、指定Map数量为1:
./sqoop import --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456 --table job_log --target-dir ‘/sqoop/jl‘ --fields-terminated-by ‘\t‘ -m 1
执行成功后,会在hdfs的根目录下创建我们的指定目录/sqoop/jl ,在jl目录下就是真正的导入到hdfs的数据文件。查看导入的数据文件内容,数据的列分隔符根据我们的要求使用了制表符分割,如下图:
1.3增加where条件, 注意:条件必须用引号引起来
./sqoop import --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456 --table job_log --where ‘ fd_start_time >"2015-06-00 00:00:00" ‘ --target-dir ‘/sqoop/jl2‘ -m 1
1.4增加query语句(使用 \ 将语句换行)
./sqoop import --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456 --query ‘SELECT * FROM job_log where fd_start_time >"2015-06-00 00:00:00" AND $CONDITIONS‘ --target-dir ‘/sqoop/jl3‘ -m 1
注意:使用--query这个命令的时候,需要注意where后面的参数,AND $CONDITIONS这个参数必须加上,而且存在单引号与双引号的区别,如果--query后面使用的是双引号,那么需要在$CONDITIONS前加上\即\$CONDITIONS。
1.5指定Map数量 -m
./sqoop import --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456 --table job_log --target-dir ‘/sqoop/jl4‘ --fields-terminated-by ‘\t‘ -m 4 --split-by fd_start_time
注意:如果设置map数量为1个时即-m 1,不用加上--split-by ${tablename.column},当设定的map 数量大于1时,需要加上参数 --split-by ${tablename.column} ,指定多个map任务执行的内容划分。
执行结果如下图:
这里发现个小问题,我是按时间来分割的,出现了数据丢失的问题。可以看到part-m-0001文件大小为0,没有数据内容。
指定多个map,并根据fd_id进行分割:
./sqoop import --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456 --table job_log --target-dir ‘/sqoop/jl4‘ --fields-terminated-by ‘\t‘ -m 4 --split-by fd_id
第二类:将HDFS上的数据导出到关系型数据库中(不要忘记指定分隔符)
2.1首先在关系数据库中创建好表空表job_log_bak :
create table job_log_bak select fd_id,fd_start_time,fd_end_time,fd_subject,fd_success from job_log where fd_id =‘1‘
然后执行命令,将hdfs上的数据导入到该表中:
./sqoop export --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456 --export-dir ‘/user/root/job_log‘ --table job_log_bak -m 1 --fields-terminated-by ‘,‘
第三类:将关系型数据库的数据导出到hive
3.1将数据库的表结构复制到hive中,只是复制表的结构:
./sqoop create-hive-table --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --table job_log --username root --password 123456 --hive-table job_log
执行成功后,其实是在hdfs 的hive 目录上创建了一个 job_log 目录,如下图:
3.2从关系数据库导入文件到hive中
./sqoop import --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456 --table job_log --hive-import -m 1 --fields-terminated-by ‘\t‘
执行成功后,会在hive的默认路径下/user/hive/warehouse/下首先创建表目录job_log,然后在该表目录下生成导入的数据的文件如part-m-00000。具体效果如下图:
注意:如果未指定字段的分隔符,将使用hive默认的分隔符 ‘\001‘
第四类:将hive的数据导出到关系型数据库
./sqoop export --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456 --table job_log_bak --export-dir /user/hive/warehouse/job_log/ -m 1 --input-fields-terminated-by ‘\t‘ --fields-terminated-by ‘,‘
注意:需要在执行的时候给sqoop增加参数 --input-fields-terminated-by,告诉sqoop读取的文件的分隔符,使它能够正确的解析文件字段。
其他使用:
列出mysql数据库中的所有数据库
./sqoop list-databases --connect jdbc:mysql://192.168.1.10:3306/ --username root --password 123456
连接mysql并列出ekp_11数据库中的表
./sqoop list-tables --connect jdbc:mysql://192.168.1.10:3306/ekp_11 --username root --password 123456
未完待续。。。
版权声明:本文为博主原创文章,未经博主允许不得转载。