徹底搞清 Kettle 數據分發方式與多線程

目錄

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章