目錄
本文介紹Kettle 8.3中數據庫分區的使用。
1. 在數據庫連接中使用集羣
在Kettle的數據庫連接對話框中,可定義數據庫分區,如圖1所示。
在“集羣”標籤,勾選“使用集羣”,然後定義三個分區。這裏的分區實際指的是數據庫實例,需要指定自定義的分區ID,數據庫實例的主機名(IP)、端口、數據庫名、用戶名和密碼。定義分區的目的是爲了從某一個分區甚至某一個物理數據庫讀取和寫入數據。一旦在數據庫連接裏面定義了數據庫分區,就可以基於這個信息創建了一個分區schema。
在“一般”標籤,只要指定連接名稱、連接類型和連接方式,在“設置”中都可以爲空,如圖2所示。Kettle假定所有的分區都是同一數據庫類型和連接類型。
定義好分區後點擊“測試”,結果如圖3所示。
2. 創建數據庫分區schemas
在“主對象樹”的“數據庫分區schemas”上點右鍵“新建”,在彈出窗口中輸入“分區schema名稱”,然後點擊“導入分區”按鈕,如圖4所示。
選擇上一步定義的數據庫連接 mysql_only_shared,點“確定”按鈕後,如圖5所示。
此時已經導入了上一步定義的三個數據庫分區。點擊“OK”保存。這樣就定義了一個名爲shared_source的數據庫分區schema。再用同樣的方法定義一個名爲shared_target的數據庫分區schema,所含分區也從mysql_only_shared導入。
至此,我們已經定義了一個包含三個分區的數據庫連接,並將分區信息導入到兩個數據庫分區schema,如圖6所示。
現在可以在任何步驟裏面應用這兩個數據庫分區schema(就是說使用這個分區的數據庫連接)。Kettle將爲每個數據庫分區產生一個步驟複製,並且它將連接物理數據庫。
3. 啓用數據庫分區
點擊步驟右鍵,選擇“分區...”菜單項,如圖7所示。
此時會彈出一個對話框,選擇使用哪個分區方法,如圖8所示。
分區方法可以是下面的一種:
- None:不使用分區,標準的“Distribute rows”(輪詢)或“Copy rows”(複製)規則被應用。
- Mirror to all partitions:使用已定義的數據庫分區schema中的所有分區。
- Remainder of division:Kettle標準的分區方法。通過分區編號除以分區數目,產生的餘數被用來決定記錄行將發往哪個分區。例如在一個記錄行裏,如果有 “73” 標識的用戶身份,而且有3個分區定義,這樣這個記錄行屬於分區1,編號30屬於分區0,編號14屬於分區2。需要指定基於分區的字段
選擇“Mirror to all partitions”,在彈出窗口中選擇已定義的分區schema,如圖9所示。
經此一番設置後,該步驟就將以分區方式執行,如圖10所示。
4. 例子
(1)將三個mysql實例的數據導入到另一個mysql實例
轉換如圖11所示。
表輸入步驟如圖12所示。
該步驟雖然連接的是mysql_only_shared。因爲是按分區方式執行,實際讀取的是三個分區的數據。三個分區的t1表數據如圖13所示。
表輸出步驟連接的是172.16.1.105的test.t4表,如圖14所示。
該轉換執行的邏輯爲:
db1.t1 + db2.t1 + db3.t1 -> db4.t4
轉換執行後,172.16.1.105的test.t4表數據如圖15所示。
如果將圖12中的數據庫連接改爲mysql_172.16.1.105,連接172.16.1.105的test.t1表。mysql_172.16.1.105本身沒有設置“使用集羣”,則轉換將從172.16.1.105取數據,但依然爲每個分區複製一份步驟,其結果等同於3線程的複製分發。轉換執行後,172.16.1.105的test.t4表數據如圖16所示。
(2)將一個mysql實例的數據分發到三個mysql實例
轉換如圖17所示。
表輸入步驟如圖18所示。
該步驟連接172.16.1.105的test.t4表。
表輸出步驟如圖19所示。
該步驟雖然連接的是mysql_only_shared。因爲是按分區方式執行,會向三個分區中的t2表輸出數據。
該轉換執行的邏輯爲:
db4.t4 -> db1.t2
db4.t4 -> db2.t2
db4.t4 -> db3.t2
轉換執行後,三個分區的test.t2表數據如圖20所示。
(3)將三個mysql實例的數據導入到另三個mysql實例
轉換如圖21所示。
輸入步驟使用的是shared_source分區schema,而輸出步驟使用的是shared_target分區schema。
表輸入步驟如圖22所示。
該步驟連接三個分區的test.t1表。
表輸出步驟如圖23所示。
向三個分區的test.t2表輸出數據。
該轉換執行的邏輯爲:
db1.t1 + db2.t1 + db3.t1 -> db4.t2
db1.t1 + db2.t1 + db3.t1 -> db5.t2
db1.t1 + db2.t1 + db3.t1 -> db6.t2
轉換執行後,三個分區的test.t2表數據如圖20所示。雖然最終結果與上一個例子相同,但執行邏輯是不同的。
(4)將三個mysql實例的數據導入相同實例的不同表中
轉換如圖24所示。
與前一個例子只有一點區別:輸入步驟與輸出步驟使用的是同一個分區schema(shared_source)。
該轉換執行的邏輯爲:
db1.t1 -> db1.t2
db2.t1 -> db2.t2
db3.t1 -> db3.t2
轉換執行後,三個分區的test.t2表數據如圖25所示。
在數據庫連接中定義分區時需要注意一點,分區ID應該唯一,如果多個分區ID相同,則所有具有相同ID的分區都會連接到第一個具有該ID的分區。例如,我們把mysql_only_shared的分區定義改爲如圖26所示:
103與104兩個分區的分區ID都是2。然後重新導入shared_source,並再次執行圖24的轉換。三個分區的test.t2表數據如圖27所示。
可以看到,103的t2表插入了兩條數據,而104沒有執行任何操作(並沒有truncate表)。