pentaho kettle是目前使用比较广泛的一种etl工具
但是在使用的时候如做定时任务 会存在如果任务异常停止会发生数据不准或者丢失数据的情况
这种情况在《Pentho Kettle Solutions》应该也有所涉及 但是并未给出实际的解决方案
以下文章是本人自己的解决思路:
首先使用标识符字段来判断数据是否已被抽取:
图中表最后一个字段flag为标识符,每次抽取数据完成后 更新此flag以表示数据已经被调取
转换示意图:
这是很常用的一种数据抽取方法,每次抽取数据都判断table A 的flag字段是否为1 如果不是1 则不抽取此条数据,抽取完成后更新flag 字段为0,这样就保证了表A的每条数据都只抽取一次
我们知道 "插入/更新" 的速度可能会比更新的速度要慢 这样数据还没有到B表 标识符就提前被更新了,当然如果转换成功完成 这并没有什么问题,但是如果此时因为意外情况转换停止了(服务器重启,停电,断网等情况),或因为某些原因需要手动停止转换,那么这时候数据就会出现数据还没有到B表 标识符已经被更新,下次抽取数据就会跳过这些数据行造成数据丢失而且原因很难查。
如何解决这个问题呢:请看转换示意图:
我们在表输入后面加了一个延迟行的步骤 延迟时间 要大于 转换中最慢的步骤的速度
这样即可保证每条数据 准且的到达目的地后 才会更新标识符 当然这样做就会牺牲转换的性能
之后有更好的方法我会及时更新