目錄
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 填...