本文环境hadoop 2.7.7,sqoop 1.4.7
Sqoop是一个在结构化数据和Hadoop之间进行批量数据迁移的工具,此篇博客没有深入的介绍sqoop的底层,只是简单介绍其功能,重点记录sqoop的使用命令 sqoop import, sqoop export, sqoop job的使用
如果想更多更深入的了解,可以查看: 官网.
Sqoop简介
Sqoop是一个在结构化数据和Hadoop之间进行批量数据迁移的工具,结构化数据可以是Mysql、Oracle等RDBMS。Sqoop底层用MapReduce程序实现抽取、转换、加载,MapReduce天生的特性保证了并行化和高容错率。
正如上图所示:Sqoop工具接收到客户端的shell命令或者Java api命令后,通过Sqoop中的任务翻译器(Task Translator)将命令转换为对应的MapReduce任务,而后将关系型数据库和Hadoop中的数据进行相互转移,进而完成数据的拷贝
Sqoop命令
一、sqoop import
- MySQL -> HDFS
- 导入数据命令
sqoop import --connect jdbc:mysql://127.0.0.1:3306/hadoop --username root --password 123456 --table test --where “id>10” --warehouse-dir /user/root/hadoop/ --column id, name –fields-terminated-by ‘|’ -m 1
参数说明
参数 | 参数介绍 | 示例 |
---|---|---|
–connect | 数据库的连接字符串,dburi: mysqlIP: mysqlPort, dbname: 数据库名 | 例如:jdbc:mysql://192.168.1.124:3306/mydatabase?useUnicode=true |
–username | 数据库用户名 | root |
–password | 数据库密码,-P 交互式指定密码 --password-file 指定密码文件 | 123456 |
–query | 查询字符串即sql语句,不可与 --table , – where同时使用 | “select * from test where id <10 AND $CONDITION ” |
–columns | 导入列的参数 | –columns id,name |
–table | 数据库表名 | –table test |
–where | 查询字符串 | –where “id > 10” |
–warehouse-dir | 导入的HDFS目的目录 | –warehouse-dir /user/hadoop/ |
–fields-terminated-by | HDFS存储格式的分割符,默认"," | –fields-terminated-by “|” |
-m | 控制导入时MR作业时map任务数量。在进行并行导入时,Sqoop会使用split-by进行负载切分(按照表PK切分),首先获取切分字段Max和Min值,再根据Max和Min进行切分,举例:student_id[0,1000],Sqoop使用4个Map任务“select * from student where id >=minand id <max” (0,250),(230,500),(500,750),(750,1000)。注释:Sqoop不能使用多个字段切分 | -m 1 |
–map-column | 类型映射,主要用于导入到hive使用 | –map-column id=String |
- 增量导入数据命令
sqoop import --connect jdbc:mysql://127.0.0.1:3306/hadoop --username root --password 123456 --table test --check-column id --incremental append --last-value “100”
sqoop import --connect jdbc:mysql://127.0.0.1:3306/hadoop --username root --password 123456 --table test --check-column create_time --incremental lastmodified --last-value “2019-09-08 08:56:09” --append
参数说明
参数 | 参数介绍 | 示例 |
---|---|---|
–ckeck-column | 指定某些列来检查并决定数据是否为增量数据,一般为int或者data数据,不可为字符串 | –check-column id |
–incremental | 指定导入模式,append和lastmodified。append: 在导入的新数据ID值是连续时使用,lastmodified:在源表中有数据更新时使用,检查列必须为日期类型的字段或者时间戳,并且有两种选择–merge-key或者–append | –incremental append |
–last-value | 指定上一次导入中指定字段最大值 | –last-value “10” |
–append | 使用lastmodified模式时使用,会将修改或者新增的数据导入hdfs,不会将修改的数据进行合并 | –append |
–merge-key | 使用lastmodified模式时使用,会将修改或者新增的数据导入hdfs,会将修改的数据与根据merge-key指定的字段进行合并 | –merge-key id |
- MySQL -> HIVE
二、sqoop export
- HDFS -> MySQL
- 导出数据命令
sqoop import --connect jdbc:mysql://127.0.0.1:3306/hadoop --username root --password 123456 --table test --export-dir /user/root/hadoop/ --column id, name -m 1
#当表中没有主键时,可多次导入,重复导入数据,如果存在主键,则会报错,并且等待报错时间很长
参数说明
参数 | 参数介绍 | 示例 |
---|---|---|
–connect | 数据库的连接字符串,dburi: mysqlIP: mysqlPort, dbname: 数据库名 | 例如:jdbc:mysql://192.168.1.124:3306/mydatabase?useUnicode=true |
–username | 数据库用户名 | root |
–password | 数据库密码,-P 交互式指定密码 --password-file 指定密码文件 | 123456 |
–columns | 导出列的参数,未被到处的列在数据库中规定必须是可以为空或者有默认值 | –columns id,name |
–export-dir | 导出目录 | –export-dir /user/root/hadoop/ |
–table | 数据库表名 | –table test |
–input-null-string | 对于字符串类型,“NULL”会被翻译为空值 | –input-null-string |
–input-null-string | 对于非字符串类型,“NULL”和空字符串会被翻译为空值 | –input-null-string |
- 增量导出数据命令
sqoop import --connect jdbc:mysql://127.0.0.1:3306/hadoop --username root --password 123456 --table test --export-dir /user/root/hadoop/ --column id, name --update-key id --updatemode updateonly -m 1
参数说明
参数 | 参数介绍 | 示例 |
---|---|---|
–update-key | 更新标志,可以指定多个更新标志 | –update-key id |
–updatemod | 两种模式,一种updateonly(默认模式),仅仅更新已存在记录,不插入新数据,另一种allowinsert 允许插入新数据 | –input-null-string |
重点
--updatemode updateonly 时 导出只是更新原记录中存在的数据,只执行 update
--updatemode allowinsert 并且 --update-key 为主键时 执行append 和 update的操作
--updatemode allowinsert 并且 --update-key不是主键时, 会将所有数据导出
- Hive -> MySQL
三、sqoop job
- 创建job
sqoop job --create job1 – import --connect jdbc:mysql://127.0.0.1:3306/hadoop --username root --password 123456 --table test --export-dir /user/root/hadoop/ --column id, name -m 1
- 查看job
sqoop job --list
- 查看job参数
sqoop job --show job1
- 执行job
sqoop job --exec job1
注释:在增量导入时,job会自动记录last-value的值