徹底搞清 Kettle 資料分發方式與多執行緒

2021-10-06 08:27:33 字數 3158 閱讀 7471

目錄

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所示。

表輸入步驟將向兩個表輸出步驟傳送資料行,此時可以選擇採用分發或複製兩種方式之一,預設為複製方式。分發方式執行後,t2、t3表的資料如圖2所示。

複製方式執行後,t2、t3表的資料如圖3所示。

區別一目了然,分發是將資料行依次發給每個輸出跳,而複製是將全部資料行傳送給所有輸出跳。目前這個轉換中的所有步驟都以單執行緒執行。下面看一下多執行緒的情況。

執行後,t2、t3表的資料如圖5所示。

可以看到,每個輸入執行緒都以分發方式將資料行依次發給每個輸出跳,結果t2表資料為兩倍的單數、而t2表資料為兩倍的雙數。

執行後,t2、t3表的資料如圖7所示。

輸入執行緒輪詢分發,單執行緒輸出每次寫一行,兩線程輸出每次寫兩行。

執行後,t2、t3表的資料如圖9所示。

輸入執行緒向兩個輸出步驟輪詢分發資料行,兩個輸出步驟每次寫兩行。

執行後,t2、t3表的資料如圖11所示。

從最後結果看,和圖5的相同,這個我們後面分析。

執行後,t2、t3表的資料如圖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執行緒的試試:

執行後,t2、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

這不是bug,而是特意為之的一種處理,kettle稱之為資料流水線。資料流水線是再分發的一種特例,在資料流水線裡源步驟和目標步驟的拷貝數相等(x==y)。此時,前面步驟拷貝的記錄行不是分發到下面所有的步驟拷貝。不用則以,要使用多執行緒一定得注意輸入輸出執行緒數相等的情況,別等資料亂套了再追悔莫及。

執行後,t2、t3表的資料相同,如圖16所示。

不出所料,兩個執行緒分別向兩個表傳送了全部資料。

執行後,t2、t3表的資料分別如圖17、18所示。

單執行緒輸出寫了一遍資料,兩線程輸出寫了兩遍資料。

執行後,t2、t3表的資料相同,如圖19所示。

兩個輸出都寫了兩遍資料。

執行後,t2、t3表的資料相同,如圖20所示。

因為輸入與輸出均為兩線程,轉為輸出單執行緒處理。

執行後,t2、t3表的資料相同,都有80條資料。資料條數為輸入表t1的行數 * 輸入執行緒數 * 輸出執行緒數。

同樣再做乙個2-2-4執行緒的測試(圖14),執行後t2表20條資料,按單執行緒輸出處理,t3表80條資料,按四執行緒輸出處理,符合預期。

由這些例子可以總結出複製方式下執行規律:分發的資料行數 = 原始行數 * 輸入執行緒數 * 輸出執行緒數。當輸入輸出執行緒數相等時,輸出按照單執行緒處理。

注意,資料分發方式只影響輸入步驟,可從步驟的右鍵選單中設定,如圖21所示。

對於輸出步驟,設定成哪種都不影響轉換執行的結果。如圖22所示的轉換,無論中間表輸出的執行緒數是幾,它的分發方式如何,最終t2和t3表的資料都和t1相同。

徹底搞清 C C 中a 與 a的區別

首先 a 和 a 的定義 看個例子 a a 5 b a 相當於a a 1 b a 結果是a 6,b 6 b a 5 b a 相當於b a a a 1 結果是a 6,b 5 所以書上有 1 如果用字首運算子對乙個變數增1 減1 則在將該變數增1 減1 後,用新值在表示式中進行其他的運算。2 如果用字尾...

徹底搞清 C C 中a 與 a的區別

首先 a 和 a 的定義 看個例子 a a 5 b a 相當於a a 1 b a 結果是a 6,b 6 b a 5 b a 相當於b a a a 1 結果是a 6,b 5 所以書上有 1 如果用字首運算子對乙個變數增1 減1 則在將該變數增1 減1 後,用新值在表示式中進行其他的運算。2 如果用字尾...

Kettle 6 0 引數方式連線資料庫

資料庫連線條件 視自己實際情況而定 資料庫 oracle 主機名稱 ip localhost 或 127.0.0.1 資料庫名稱 sid myorcl 埠號 1521 使用者名稱 scott 密碼 tiger 連線名稱 隨意 db ora 連線型別 oracle 連線方式 native jdbc 填...