使用kettle进行增量抽取数据

使用背景:
当前项目中使用的数据依赖于其它系统,别人的系统当然不会把实时更新的数据一个不差的发送给我们(当然更加不会让我们对他们系统的数据库进行编程),所以我们要自己动手去获取他们系统中的数据。

使用工具:
kettle

首先需要考虑的问题是不可能是全量进行数据的拷贝,数据量如此庞大!
那么就得考虑增量,何为增量去百度。。哈哈哈

至于如何增量抽取数据,有很多种办法,我这里示范的是通过时间去增量抽取(因为刚好别人的库中每条记录的时间记录的都相当详细,所以我认为这个比较好)。

首先创建好实例库:

SQL> desc timejob;
Name      Type         Nullable Default Comments 
--------- ------------ -------- ------- -------- 
UUID      VARCHAR2(36) Y                         
BEGINTIME DATE         Y                         
SQL> desc timejob_bak;
Name      Type         Nullable Default Comments 
--------- ------------ -------- ------- -------- 
UUID      VARCHAR2(36) Y                         
BEGINTIME DATE         Y                         

kettle中有自动生成UUID的功能,所以直接拿过来耍,为了简洁方便,字段使用比较少。
首先利用kettle自动生成测试数据:
这里写图片描述
这里写图片描述
主要生成UUID和当前系统时间到timejob表中(每隔2s执行一次),我们后续的操作都是对这张表中的数据进行一个备份。

下面第二步就是抽取该表中的数据到一个备份表中,timejob_bak。
这里写图片描述
这里写图片描述
这里由于是我第一次操作,比较简单,就直接上图了。。

获得上次操作时间和系统时间存到变量中:
这里写图片描述
这里的开始时间是通过表数据选项获得上一次操作的最终结束时间,以作为我此次增量抽取的开始时间。第二个变量是获得系统的当前时间。

根据时间抽取timejob表中的数据:
这里写图片描述
获取变量的写法:
这里写图片描述
此处获取的变量就是上一步存入的变量,下面的抽取增量数据就是一个sql,从timejob表中抽取数据,存数据就是一个表输出。
抽取数据sql:

SELECT
  UUID
, BEGINTIME
FROM TIMEJOB
where begintime > to_date(substr('${endtime}',1,19),'yyyy-mm-dd hh24:mi:ss')
and begintime <= to_date(substr('${sysdate}',1,19),'yyyy-mm-dd hh24:mi:ss')

在这个表输入功能里面有个注意点:
这里写图片描述
必须将替换sql语句变量打钩,否则变量无法识别。
表输出就没什么可以写的了。

最后一个操作就是记录本次的操作时间的相关记录。

附上连跑半个多小时的数据记录:
这里写图片描述
这里写图片描述
这里写图片描述
看结果可知存在遗漏抽取(后来清空数据又跑了一次,发现随着时间的增长,两张表中数据量的差距越来越大),所以想法子查找出原因,就要考虑到底是什么问题。

由于sql比较简单,因此不会出现sql的问题,数据也没有胡乱试的增长(刚开始玩kettle的时候,我把第二大步骤的三个转换写在一个转换里面,数据总是炸),所以就考虑唯一能够存在的问题:时间。。

因为生成数据是2s一次,而数据抽取是6s一次,就要考虑是不是在每隔6s的时间点上,数据录入了,但是没有被抽取作业给读取到,但是当前时间段已经跳过去了,造成了数据遗漏,进库测试下。
胡乱写个sql测试下:
这里写图片描述

根据之前的测试数据量测试结果:
841 - 678 = 163.。。。。
结果跟测试的数据量刚好吻合,说明我们的猜想是正确的,那么就要考虑如何解决这个问题。
如果按照两个作业时间间隔的最小公倍数计算,我怎么设置时间都是有可能出现这种情况的,wtf!!!!

那么想法子改sql,之前的sql是每一次任务读取的是上一次任务结束到当前时间(包括当前时间),如果我想法子把当前时间产生的数据留到下一次读取是否可行?let’s do it。

改sql我就不贴了,清空测试数据直接开跑:
这里写图片描述
这里写图片描述
跑了将近20分钟的结果,数据一个不漏,很好很强大。。。

项目试运行的时候,客户说kettle会莫名的自动关闭,哎!有哪位大神懂的路过指导下吧。。。不胜感激,谢谢

贴个大神的整理帖子:
http://www.cnblogs.com/jifeng/p/4741498.html

  • 14
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值