我们在使用Sqoop的增量导入时,需要配置三个参数:
假设有这样的场景:
使用Sqoop每天定时导出emp表的增量数据,其中emp的id列为自增列。
那么此时有两种方式实现:
(1) 每天手工配置last-value,手工调度;
(2) 使用job,给定初始last-value,定时任务每天自动跑批;
相信大多数人会选择第(2)种方式。
为什么job可以给定一次last-value就可以自动抽取增量呢?
这是因为批量每次跑完后,job会把当前check-column的最大值记录到meta中,下次再调起时自动把此值赋给last-value。
meta信息存在哪里呢?
在sqoop-site.xml中有这样的配置:
sqoop.metastore.server.location /tmp/sqoop-metastore/shared.db Path to the shared metastore database files. If this is not set, it will be placed in ~/.sqoop/.
可以发现,sqoop.metastore.server.location就是与元数据相关的保存路径。
如果没有设置,默认路径是:~/.sqoop/
[hadoop@node03 conf]$ cd ~/.sqoop/
[hadoop@node03 .sqoop]$ ll
total 12
-rw-rw-r-- 1 hadoop hadoop 419 Feb 21 19:31 metastore.db.properties
-rw-rw-r-- 1 hadoop hadoop 6198 Feb 21 19:31 metastore.db.script
其中,metastore.db.script文件记录了对last-value的更新操作:
[hadoop@node03 .sqoop]$ cat metastore.db.script |grep incremental.last.value
INSERT INTO SQOOP_SESSIONS VALUES('myjob1','incremental.last.value','1205','SqoopOptions')
上面的例子显示,更新SQOOP_SESSIONS的incremental.last.value为1205。
也就是我的实验中最后一次增量的最大值。
下面是完整实验过程,想验证的小伙伴可以参考:
1.mysql中建库,建表并插入测试数据:
create database userdb;
use userdb;
create table emp(
id int(11) default null,
name varchar(100) default null,
deg varchar(100) default null,
salary int(11) default null,
dept varchar(10) default null,
create_time timestamp not null default current_timestamp,
update_time timestamp not null default current_timestamp on update current_timestamp,
is_delete bigint(20) default '1'
)
engine = innodb default charset=latin1;
insert into emp(id,name,deg,salary,dept) values (1201,'gopal','manager',50000,'TP'),
(1202,'manisha','Proof reader',50000,'TP'),
(1203,'khalil','php dev',30000,'AC'),
(1204,'prasanth','php dev',30000,'AC'),
(1205,'kranthi','admin',20000,'TP');
2.新建sqoop job
bin/sqoop job --create myjob1 -- import \
--connect jdbc:mysql://node03:3306/userdb \
--username root --password 123456 \
--table emp \
--incremental append \
--check-column id \
--last-value 1202 \
--target-dir /sqoop/increment/emp \
-m 1
3.执行job
bin/sqoop job --exec myjob1
4.观察last-value的更新值,发现已经更新为最大值
[hadoop@node03 conf]$ cd ~/.sqoop/
[hadoop@node03 .sqoop]$ cat metastore.db.script |grep incremental.last.value
INSERT INTO SQOOP_SESSIONS VALUES('myjob1','incremental.last.value','1205','SqoopOptions')