Sqoop增量导入注意事项 incremental lastmodified与target-dir连用报错 Imported Failed: Wrong FS

[root@hadoop01 flume-1.9.0]# sqoop job --create my1jobs -- import --connect jdbc:mysql://hadoop01:3306/test \
> --username root --password root \
> --driver com.mysql.jdbc.Driver \
> --table testlast \
> -m 1 \
> --incremental lastmodified \
> --check-column lastmodify \
> --last-value '2019/09/20 14:39:00' \
> --target-dir hdfs://ali:8020//user/hive/warehouse/guli.db/testlast

1.ERROR tool.ImportTool: Imported Failed: Wrong FS:

19/09/21 15:21:24 ERROR tool.ImportTool: Imported Failed: Wrong FS: hdfs://ali:8020/user/hive/warehouse/guli.db/testlast, expected: hdfs://ali

去掉hdfs://ali:8020 前缀

–target-dir 本来就是指定的hdfs的目录

sqoop job --create my1jobs -- import --connect jdbc:mysql://hadoop01:3306/test \
--username root --password root \
--driver com.mysql.jdbc.Driver \
--table testlast \
-m 1 \
--incremental lastmodified \
--check-column lastmodify \
--last-value '2019/09/20 14:39:00' \
--target-dir /user/hive/warehouse/guli.db/testlast

2.错误提示 很明白

  • 要么 --incremental append
  • 要么 --incremental lastmodified 加上 --merge-key
19/09/21 15:32:25 ERROR tool.ImportTool: 
Error during import:
 --merge-key or --append is required 
 when using --incremental lastmodified and the output directory exists.

所以最终的

sqoop job --create my1jobs -- import --connect jdbc:mysql://hadoop01:3306/test \
--username root --password root \
--driver com.mysql.jdbc.Driver \
--table testlast \
-m 1 \
--merge-key id \
--incremental lastmodified \
--check-column lastmodify \
--last-value '2019/09/20 14:39:00' \
--target-dir /user/hive/warehouse/guli.db/testlast

最终结论

1.使用–incremental lastmodified 与 --target-dir 时,必须指定是导入方式 是合并还是追加,即必须再加属性 --merge-key 或者 --append

2.append不能与–hive-等参数同时使用(Append mode for hive imports is not yet supported. Please remove the parameter --append-mode)

3.–incremental lastmodified 与–hive-等参数同时使用时,不会合并任何数据,只是追加,加上 --merge-key 貌似不报错,但是也没有生效,就是不合并

4.所以实现增量导入的方式:

前边都差不多,长这样

sqoop job --create myfirstjob \
--import \
--connect jdbc:mysql://hadoop01:3306/test \
--username root --password root \
--driver com.mysql.jdbc.Driver \
--table mysqltablename\
.......
.......
.......

1.使用 --incremental lastmodified 与 --hive-等参数 连用
实现 从mysql表直接导入hive表,hive表需要提前创建。 ,这个没有我没有试,我都是先建表,然后再使用–hive导入,经过大佬的友好提示,说是,不用提前建表!!! 直接导入即可,会自动建表
so

使用–hive不必提前建表 使用–target-Dir所指定的目录必须提前创建。

这样只是增量导入 mysql字段lastmodify(我用的datetime类型)的值 只要比–last-value 指定的时间大,就导入。
创建好job 执行后会自动更新–last-value 值为当前时间(执行job的时间)

.......
.......
.......
--hive-import \
--hive-table testlast \
--incremental lastmodified \
--check-column lastmodify \
--last-value '2019/09/20 14:39:00'

2.上面加上 --merge-key 没有什么用

3.–incremental lastmodified 与–target-dir 连用时必须指定是要合并–merge-key还是–append追加数据。
使用目录了 就不用提前创建hive表了。
指定–merge-key 就会根据字段合并更新值了。

.......
.......
.......
-m 1 \ 
--merge-key id \
--incremental lastmodified \
--check-column lastmodify \
--last-value '2019/09/20 14:39:00' \
--target-dir /user/hive/warehouse/guli.db/testlast
.......
.......
.......
-m 1 \ 
--append \
--incremental lastmodified \
--check-column lastmodify \
--last-value '2019/09/20 14:39:00' \
--target-dir /user/hive/warehouse/guli.db/testlast

-m 启动N个map来并行导入数据,默认4个 这个感觉指不指定都一样
如果出错可能是(指定了-m的话,对应的导入会在hdfs上差生相应的中间结果,当你下一次再次执行同一个job时,则会因为output directory is exist 报错。或者使用 -m 1 再加上 --delete-target-dir \ 删除存在的目标目录 也行
即 -m 1 与 --delete-target-dir 连用)

4.增量append方式导入数据

.......
.......
.......
增量append方式导入数据:
-m 1 \
--incremental append \
--check-column id \
--last-value 0 \
--target-dir hdfs://qf:8020//user/hive/warehouse/guli.db/userinfo

5.注意mysql导入到hdfs这边的数据默认使用逗号作为分隔符
使用sqoop的创建hive表的语句 默认分隔符是 ‘\u0001’,
emmm,但是没有找到sqoop指定hive表的分隔符的字段,你们有看到吗?

sqoop create-hive-table \
--connect jdbc:mysql://hadoop01:3306/test \
--username root --password root \
--table testlast \
--hive-database guli \
--hive-table testlast

sqoop create-hive-table 这个建表语句 是为mysql表中字段太多 不方便建hive表准备的
可以使用它建完hive表再修改hive表中的分隔符
alter table test01 set serdeproperties(‘field.delim’=’\t’);

test01为表名

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值