完全搞清 Kettle 数据分发方式与多线程

目录多线程

1. 分发方式测试

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

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

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

(4)全部步骤均为两线程blog

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

2. 复制方式bug

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

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

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

(4)全部步骤均为两线程(图10)

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


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

图1

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

图2

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

图3

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

1. 分发方式

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

图4

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

图5

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

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

图6

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

图7

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

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

图8

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

图9

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

(4)全部步骤均为两线程

图10

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

图11

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

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

图12

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

图13

        输出为四线程,所以输入的第一个线程将前四行发送到输出1,而后将接着的四行发送到输出2,而后再将接着的四行(此时只剩两行)发送到输出1。输入的第二个线程也一样执行这样的过程。最终t2表两个一、二、三、四、九、10,t3表有两个五、六、七、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

        执行后,t二、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)

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

图16

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

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

        执行后,t二、t3表的数据分别如图1七、18所示。

图17
图18

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

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

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

图19

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

(4)全部步骤均为两线程(图10)

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

图20

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

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

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

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

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

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

图21

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

图22
相关文章
相关标签/搜索