目錄多線程
1. 分發方式測試
(4)全部步驟均爲兩線程blog
(5)輸入步驟爲兩線程,輸出步驟爲四線程class
2. 複製方式bug
(2)輸入單線程,兩個輸出,一個單線程、另外一個兩線程(圖6)d3
Kettle轉換中,各步驟之間行集(row set)的發送有分發和複製兩種方式,本文討論這兩種方式的區別,以及它們與Kettle多線程的關係。咱們用一個簡單的例子輔助說明,Kettle版本爲8.3。定義一個轉換,以t1表做爲輸入,輸出到表t2和t3。t1表中有1-10十個整數。當建立第二個跳(hop)時,會彈出一個警告窗口,如圖1所示。
表輸入步驟將向兩個表輸出步驟發送數據行,此時能夠選擇採用分發或複製兩種方式之一,缺省爲複製方式。分發方式執行後,t二、t3表的數據如圖2所示。
複製方式執行後,t二、t3表的數據如圖3所示。
區別一目瞭然,分發是將數據行依次發給每一個輸出跳,而複製是將所有數據行發送給全部輸出跳。目前這個轉換中的全部步驟都以單線程執行。下面看一下多線程的狀況。
1. 分發方式
(1)輸入兩線程,輸出單線程
執行後,t二、t3表的數據如圖5所示。
能夠看到,每一個輸入線程都以分發方式將數據行依次發給每一個輸出跳,結果t2表數據爲兩倍的單數、而t2表數據爲兩倍的雙數。
(2)輸入單線程,兩個輸出,一個單線程、另外一個兩線程
執行後,t二、t3表的數據如圖7所示。
輸入線程輪詢分發,單線程輸出每次寫一行,兩線程輸出每次寫兩行。
(3)輸入單線程、兩個輸出均爲兩線程
執行後,t二、t3表的數據如圖9所示。
輸入線程向兩個輸出步驟輪詢分發數據行,兩個輸出步驟每次寫兩行。
(4)全部步驟均爲兩線程
執行後,t二、t3表的數據如圖11所示。
從最後結果看,和圖5的相同,這個咱們後面分析。
(5)輸入步驟爲兩線程,輸出步驟爲四線程
執行後,t二、t3表的數據如圖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線程的試試:
執行後,t二、t3表的數據如圖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所示。
不出所料,兩個線程分別向兩個表發送了所有數據。
(2)輸入單線程,兩個輸出,一個單線程、另外一個兩線程(圖6)
執行後,t二、t3表的數據分別如圖1七、18所示。
單線程輸出寫了一遍數據,兩線程輸出寫了兩遍數據。
(3)輸入單線程、兩個輸出均爲兩線程(圖8)
執行後,t二、t3表的數據相同,如圖19所示。
兩個輸出都寫了兩遍數據。
(4)全部步驟均爲兩線程(圖10)
執行後,t二、t3表的數據相同,如圖20所示。
由於輸入與輸出均爲兩線程,轉爲輸出單線程處理。
(5)輸入步驟爲兩線程,輸出步驟爲四線程(圖12)
執行後,t二、t3表的數據相同,都有80條數據。數據條數爲輸入表t1的行數 * 輸入線程數 * 輸出線程數。
一樣再作一個2-2-4線程的測試(圖14),執行後t2表20條數據,按單線程輸出處理,t3表80條數據,按四線程輸出處理,符合預期。
由這些例子能夠總結出複製方式下執行規律:分發的數據行數 = 原始行數 * 輸入線程數 * 輸出線程數。當輸入輸出線程數相等時,輸出按照單線程處理。
注意,數據分發方式隻影響輸入步驟,可從步驟的右鍵菜單中設置,如圖21所示。
對於輸出步驟,設置成哪一種都不影響轉換執行的結果。如圖22所示的轉換,不管中間表輸出的線程數是幾,它的分發方式如何,最終t2和t3表的數據都和t1相同。