彻底搞清 Kettle 数据分发方式与多线程

邮差的信 提交于 2020-08-11 04:50:57

目录

1. 分发方式

(1)输入两线程,输出单线程

(2)输入单线程,两个输出,一个单线程、另一个两线程

(3)输入单线程、两个输出均为两线程

(4)所有步骤均为两线程

(5)输入步骤为两线程,输出步骤为四线程

2. 复制方式

(1)输入两线程,输出单线程(图4)

(2)输入单线程,两个输出,一个单线程、另一个两线程(图6)

(3)输入单线程、两个输出均为两线程(图8)

(4)所有步骤均为两线程(图10)

(5)输入步骤为两线程,输出步骤为四线程(图12)


        Kettle转换中,各步骤之间行集(row set)的发送有分发和复制两种方式,本文讨论这两种方式的区别,以及它们与Kettle多线程的关系。我们用一个简单的例子辅助说明,Kettle版本为8.3。定义一个转换,以t1表作为输入,输出到表t2和t3。t1表中有1-10十个整数。当创建第二个跳(hop)时,会弹出一个警告窗口,如图1所示。

图1

        表输入步骤将向两个表输出步骤发送数据行,此时可以选择采用分发或复制两种方式之一,缺省为复制方式。分发方式执行后,t2、t3表的数据如图2所示。

图2

复制方式执行后,t2、t3表的数据如图3所示。

图3

        区别一目了然,分发是将数据行依次发给每个输出跳,而复制是将全部数据行发送给所有输出跳。目前这个转换中的所有步骤都以单线程执行。下面看一下多线程的情况。

1. 分发方式

(1)输入两线程,输出单线程

图4

        执行后,t2、t3表的数据如图5所示。

图5

        可以看到,每个输入线程都以分发方式将数据行依次发给每个输出跳,结果t2表数据为两倍的单数、而t2表数据为两倍的双数。

(2)输入单线程,两个输出,一个单线程、另一个两线程

图6

        执行后,t2、t3表的数据如图7所示。

图7

        输入线程轮询分发,单线程输出每次写一行,两线程输出每次写两行。

(3)输入单线程、两个输出均为两线程

图8

        执行后,t2、t3表的数据如图9所示。

图9

        输入线程向两个输出步骤轮询分发数据行,两个输出步骤每次写两行。

(4)所有步骤均为两线程

图10

        执行后,t2、t3表的数据如图11所示。

图11

        从最后结果看,和图5的相同,这个我们后面分析。

(5)输入步骤为两线程,输出步骤为四线程

图12

        执行后,t2、t3表的数据如图13所示。

图13

        输出为四线程,因此输入的第一个线程将前四行发送到输出1,然后将接着的四行发送到输出2,然后再将接着的四行(此时只剩两行)发送到输出1。输入的第二个线程也同样执行这样的过程。最终t2表两个1、2、3、4、9、10,t3表有两个5、6、7、8。

        由前面这些例子可以总结出分发方式下执行规律:每个输入步骤线程执行相同的工作,即轮流向每个输出步骤发送数据行,每次发送的行数等于相应输出步骤的线程数。但是,图10-图11并不符合这个规律。

        我理解图10应该这样执行:
输入线程1:t2:12 56 910  t3: 34 78  
输入线程2:t2:12 56 910  t3: 34 78

但实际执行的效果却与图4相同。从现象看貌似输入输出线程数相等时,就会忽略输出的多线程,而当做单线程处理。再做一个2-2-4线程的试试:

图14

        执行后,t2、t3表的数据如图15所示。

图15

        按一般的规律应该这样执行:
输入线程1:t2:12 78 t3:3456 910
输入线程2:t2:12 78 t3:3456 910

但因为输入和第一个输出线程数相同了,于是第一个输出就按单线程处理:
输入线程1:t2:1 6 t3:2345 78910
输入线程2:t2:1 6 t3:2345 78910

        斗胆猜想,这很可能是Kettle 8.3版本的一个bug。不用则以,要使用多线程一定得注意输入输出线程数相等的情况,别等数据乱套了再追悔莫及。

2. 复制方式

(1)输入两线程,输出单线程(图4)

        执行后,t2、t3表的数据相同,如图16所示。

图16

        不出所料,两个线程分别向两个表发送了全部数据。

(2)输入单线程,两个输出,一个单线程、另一个两线程(图6)

        执行后,t2、t3表的数据分别如图17、18所示。

图17
图18

        单线程输出写了一遍数据,两线程输出写了两遍数据。

(3)输入单线程、两个输出均为两线程(图8)

        执行后,t2、t3表的数据相同,如图19所示。

图19

        两个输出都写了两遍数据。

(4)所有步骤均为两线程(图10)

        执行后,t2、t3表的数据相同,如图20所示。

图20

        因为输入与输出均为两线程,转为输出单线程处理。

(5)输入步骤为两线程,输出步骤为四线程(图12)

        执行后,t2、t3表的数据相同,都有80条数据。数据条数为输入表t1的行数 * 输入线程数 * 输出线程数。

        同样再做一个2-2-4线程的测试(图14),执行后t2表20条数据,按单线程输出处理,t3表80条数据,按四线程输出处理,符合预期。

        由这些例子可以总结出复制方式下执行规律:分发的数据行数 = 原始行数 * 输入线程数 * 输出线程数。当输入输出线程数相等时,输出按照单线程处理。

        注意,数据分发方式只影响输入步骤,可从步骤的右键菜单中设置,如图21所示。

图21

        对于输出步骤,设置成哪种都不影响转换执行的结果。如图22所示的转换,无论中间表输出的线程数是几,它的分发方式如何,最终t2和t3表的数据都和t1相同。

图22

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!