1.import/export通用
选项 含义说明
--connect
--connection-manager
--driver
--hadoop-mapred-home
--help 打印用法帮助信息
--password-file 设置用于存放认证的密码信息文件的路径
-P 从控制台读取输入的密码
--password
--username
--verbose 打印详细的运行信息
--connection-param-file
2.import
选项 含义说明
--append 将数据追加到HDFS上一个已存在的数据集上
--as-avrodatafile 将数据导入到Avro数据文件
--as-sequencefile 将数据导入到SequenceFile
--as-textfile 将数据导入到普通文本文件(默认)
--boundary-query
--columns
--delete-target-dir 如果指定目录存在,则先删除掉
--direct 使用直接导入模式(优化导入速度)
--direct-split-size
--fetch-size
--inline-lob-limit
-m,--num-mappers
-e,--query
--split-by
--table
--target-dir
--warehouse-dir
--where
-z,--compress 启用压缩
--compression-codec
--null-string
--null-non-string
3.export
选项 含义说明
--validate
--validation-threshold
--direct 使用直接导出模式(优化速度)
--export-dir
-m,--num-mappers
--table
--call
--update-key
--update-mode
--input-null-string
--input-null-non-string
--staging-table
--clear-staging-table 清除工作区中临时存放的数据
--batch 使用批量模式导出
参照上表,列举常用的命令,使用 sql 语句查询时,需要指定 $CONDITIONS
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --query 'SELECT * from TBLS where \$CONDITIONS ' --split-by tbl_id -m 4 --target-dir /user/hive/result
上面命令通过 -m 1 控制并发的 map 数。
使用 direct 模式:
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --delete-target-dir --direct --default-character-set UTF-8 --target-dir /user/hive/result
指定文件输出格式:
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by "\t" --lines-terminated-by "\n" --delete-target-dir --target-dir /user/hive/result
指定空字符串:
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by "\t" --lines-terminated-by "\n" --delete-target-dir --null-string '\\N' --null-non-string '\\N' --target-dir /user/hive/result
如果需要指定压缩:
$ sqoop import --connect jdbc:mysql://192.168.56.121:3306/metastore --username hiveuser --password redhat --table TBLS --fields-terminated-by "\t" --lines-terminated-by "\n" --delete-target-dir --null-string '\\N' --null-non-string '\\N' --compression-codec "com.hadoop.compression.lzo.LzopCodec" --target-dir /user/hive/result
在增量导出模式下,无论是allowinsert模式还是updateonly模式,都需要设置update-key:
1.allowinsert模式:该模式下生成的是insert语句,从这个角度讲update-key是没有作用的,但是在CDH Sandbox上测试时发现,如果不指定update-key则会导致reduce执行失败。
2. updateonly模式:该模式下生成的是update语句,update-key中指定的字段用于构成update语句中的where字句,因此是必须的,同时也可以看出选择的update-key字段必须是未被更新的字段,这样才能确定一条记录导出前后是否一致,而如果将update-key设置为被更新过的字段,则在目标表中通过where条件筛选不到匹配的记录,从而造成数据无法被更新。此外,如果update-key中指定了所有字段,也会报错。
参数介绍
--update-key 后面也可以接多个关键字列名,可以使用逗号隔开,Sqoop将会匹配多个关键字后再执行更新操作。
--export-dir 参数配合--table或者--call参数使用,指定了HDFS上需要将数据导入到MySQL中的文件集目录。
--update-mode updateonly和allowinsert。 默认模式为updateonly,如果指定--update-mode模式为allowinsert,可以将目标数据库中原来不存在的数据也导入到数据库表中。即将存在的数据更新,不存在数据插入。
组合测试及说明
1、当指定update-key,且关系型数据库表存在主键时:
A、allowinsert模式时,为更新目标数据库表存的内容,并且原来不存在的数据也导入到数据库表;
B、updateonly模式时,为更新目标数据库表存的内容,并且原来不存在的数据也不导入到数据库表;
2、当指定update-key,且关系型数据库表不存在主键时:
A、allowinsert模式时,为全部数据追加导入到数据库表;
B、updateonly模式时,为更新目标数据库表存的内容,并且原来不存在的数据也不导入到数据库表;
3、当不指定update-key,且关系型数据库表存在主键时:
A、allowinsert模式时,报主键冲突,数据无变化;
B、updateonly模式时,报主键冲突,数据无变化;
4、当不指定update-key,且关系型数据库表不存在主键时:
A、allowinsert模式时,为全部数据追加导入到数据库表;
B、updateonly模式时,为全部数据追加导入到数据库表;
所以再用 不同的 --update-mode 模式时,注意关系型数据库的主键设置,否则会影响数据的导出效果。
四.常见错误:
1.使用 --update-mode allowinsert 导出时,报错
Error during export:
Mixed update/insert is not supported against the target database yet
原因:指定的Jdbc 连接器不支持 allowinsert;
解决:删除 --driver com.mysql.jdbc.Driver (如果出现新的报错 删除 --direct ) 问题可以解决;
2.sqoop导出hive数据到MySQL出现字符编码问题解决
ERROR [Thread-11] org.apache.sqoop.mapreduce.AsyncSqlOutputFormat: Got exception in update thread: java.sql.SQLException: Incorrect string value: '\xF0 'itemName' at row 70;
java.sql.SQLException: Incorrect string value: '\xF0\xA1\xB7\x8A\xF0\xA1...' for column 'itemName' at row 70
原因:由于MySQL表编码位数导致,解决
解决 : 1.修改表的编码格式:
alter table 表名 convert to character set utf8mb4 collate utf8mb4_bin;
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2.sqoop导命令指定编码格式:
export --connect "jdbc:mysql://ip:port/库名?useUnicode=true&characterEncoding=utf-8" --username 用户民--password 密码 --table 表名 --columns "字段1,字段2,..,字段n" --export-dir "hdfs:// 路径" --fields-terminated-by '\t' --input-null-string '\\N' --input-null-non-string '\\N' -m 1 --driver com.mysql.jdbc.Driver;
重新执行导出命令,成功!(前提确保数据库编码是UTF8);
(遇到问题不断更新。。。)