Sqoop1.4.6 增量导入HDFS

一、 增量导入模式简介

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中:


    sqoop.metastore.client.record.password
    true
    If true, allow saved passwords in the metastore.
    
  
当这个值为真的时候才会保存密码。
配置更改过要重新建任务才会生效,把之前的任务删除:

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三个参数在命令中都必须同时使用。

你可能感兴趣的:(sqoop)