1、kettle中转换和作业的执行顺序
1、一个作业内的转换,是顺序执行的。
2、一个转换内的步骤是并行执行的。
3、作业内不支持事务,转换内支持事务。
2、根据业务需要,通常需要在转换内顺序执行,小技巧如下
1、执行SQL是优先于所有步骤。
2、使用“阻塞数据直到步骤都完成”,确保其他数据步骤都完成再进行下一步骤。
3、为什么会用到这个组件
我就想转换串行的执行,根据时间戳增量的同步,作业一开始我就获取当前的时间戳,kettle 完成数据之后,再执行时间更新戳操作,不能数据还没有同步成功就把时间戳更新,万一同步失败怎么办?因为作业执行也需要时间,公司传感器收集的数据会间歇性写入MySQL,数据几分钟刷新一次,不想丢失数据,也不能重复,尽可能保持数据一致性。
kettle转换中的各个步骤是并列执行的关系,作业中的步骤才是有先后顺序的。这样就可能会遇到一种情况,我想在转换的某个步骤完成后才执行它下面的步骤,这时该怎么办呢?那么这时就可以用到【阻塞数据直到完成】组件。
- 【阻塞数据直到完成】:这个组件允许设置需要阻塞的具体步骤,会将所设置的步骤的所有数据堵住,当这些步骤完成后,才会将被阻塞步骤的所有数据往下一个步骤推;
注:虽然阻塞了,但是阻塞之后的步骤仍然在运行,即运行时间仍然在进行;
4、案例演示
看下面的列子,最后的SQL脚本想在前面的步骤执行完后执行,这里可用阻塞实现。
【注】:此时别忘了勾选{执行每一行}这个选项,逻辑原理是,只有执行每一行,该步骤才会向上级步骤要数据,因为上级阻塞了不给数据,这样阻塞才能起作用。
当【阻塞数据】通过最后一条数据后,也是唯一 一条数据,SQL脚本才执行一次,这正是我们想要的目的。
此处我的需求用不到这个 阻塞数据,我在一个转换中放了太多的操作,我们大可不必放在一个转换中, 而将更新时间戳的步骤放到作业中的最后一步执行,将时间戳获取-->设置变量 放到另一个转换中,这样方便测试,也可以让kettle程序 看起来简单明了,用不用这个组件还是要看需求。