【Sqoop】Sqoop job实现增量导入的原理

我们在使用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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值