一、 增量导入模式简介
Sqoop提供将新数据导入,而已经导入的数据不再执行导入操作,即增量导入操作。使用以下参数:
--check-column (col) | 指定一个“标志列”用于判断增量导入的数据范围,该列不能是字符型,最好是数字或者日期型(这个很好理解吧)。 |
--incremental (mode) | 指定增量模式,包含“追加模式” append 和“最后修改模式” lastmodified (该模式更满足常见需求)。 |
--last-value (value) | 指定“标志列”上次导入的上界。如果“标志列”是最后修改时间,则--last-value为上次执行导入脚本的时间。 |
结合Saved Jobs机制,可以实现重复调度增量更新Job时 --last-value 字段的自动更新赋值,再结合cron或者oozie的定时调度,可实现真正意义的增量更新。
二、 增量job的创建和执行
创建增量更新job:
sqoop job --create myjob -- import --connect jdbc:Oracle:thin:@192.168.0.138:1521:orcl --username ora --password oraalk --table FBI_SQOOPTEST --hive-import --target-dir /usr/input --incremental append --check-column ID --last-value 0
执行Job:
sqoop job --exec myjob
注:数据库里有主键的表才可以读取,这个是我测试的结果
在执行job时会有数据库密码的校验:
$ sqoop job --exec myjob
Enter password:
...
sqoop-metastore命令可以检查你配置sqoop数据连接的正确性,所有要更改配置在sqoop-site.xml中:<property>
<name>sqoop.metastore.client.record.password</name>
<value>true</value>
<description>If true, allow saved passwords in the metastore.
</description>
</property>
当这个值为真的时候才会保存密码。配置更改过要重新建任务才会生效,把之前的任务删除:
sqoop job --delete myjob
重复上述操作,执行时不用输入数据库密码校验。
三、 结果查看
到hdfs目录下查看文件数据:
hdfs dfs -cat /usr/input/*
56,hua,hanyun,男,开通,2013-12-02,0,1
58,feng,123456,男,开通,2013-11-22,0,0
59,test,123456,男,开通,2014-03-05,58,0
60,user1,123456,男,开通,2014-06-26,66,0
61,user2,123,男,开通,2013-12-13,56,0
62,user3,123456,男,开通,2013-12-14,0,0
64,kai.zhou,123456,null,null,2014-03-05,65,0
65,test1,111,男,未开通,null,0,0
66,test2,111,男,未开通,null,0,0
67,test3,113,男,未开通,null,0,0
为了测试只导入新增的数据,把hdfs上的数据都删除
hdfs dfs -rmr /usr/input/*
接下来到oracle里插入一条数据,再执行任务:
sqoop job --exec myjob
再查看只有新增的一条数据:68,test3,113,男,未开通,null,0,0
四、 总结
Sqoop的“Saved Jobs”机制对于增量导入类Job,自动记录了上一次的执行内容,并自动将该时间赋值给下一次执行的--last-value参数!也就是说,我们只需要通过crontab设定定期执行该job即可,job中的--last-value将被“Saved Jobs”机制自动更新以实现真正意义的增量导入。
五、 使用lastmodified,增量导入
使用lastmodified增量导入,指定列--check-column后面需要接的是一个时间戳列,然后再使用--last-value后接最近的一个时间,以此实现修改操作的导入。使用方法同append类似,这里不详说。注意:不管是使用哪种模式导入,--check-column、--incremental和--last-value三个参数在命令中都必须同时使用。