1. 程式人生 > >Kettle批量操作流程使用(一)---單個數據源多表批量操作

Kettle批量操作流程使用(一)---單個數據源多表批量操作

    最近在工作上用到了kettle,目前這個開源的ETl工具相對來說比較火,用做資料抽取清洗工作很方便也很快捷。當然也還有不少的問題,比如使用過程中會發生閃退(測試了幾個版本都存在),還有建好的Job和Transfer儲存檔案,然後再次開啟的時候都是空白。拋開這些問題暫時不說,試用了一段時間以後,確實是解決了很多很大的問題。

    在使用kettle之前,自己生產了一個任務排程系統去完成ETl工作,不過使用起來還比較麻煩,對於批量的表,批量的資料來源匯入擴充套件性不是很好。而現在kettle的功能完全能滿足我們目前的任務需求,同時kettle目前這麼火沒有理由不去接觸kettle。

    我們的需求是這樣,目前我們的業務系統在線上部署了1000多個獨立使用者節點,而這1000多個節點的資料表結構基本上都相同,因此我們想要在kettle完成的一個工作就是,編寫一個流程完成1000多個使用者節點,1000多張表的資料抽取。如果一個表維護一個任務,那總共要維護1000*1000個任務,如果一個使用者節點維護一個任務,那總共要維護1000多個任務。而基於各個節點的業務表結構基本一樣這個特點,我們想要的是隻維護一個任務,完成1000多個使用者節點和1000多個表的資料抽取。基於這個需求,我們分三個步驟完成了前期調研測試。在此將三個步驟測試過程和結果放在這裡,期待高手能給出更好的解決思路和方法。本實驗測試環境的源資料庫:Postgres,目標資料庫:Postgres(正式環境將採用GreenPlum)

   (1)單個數據源多表批量操作:每次只連線一個數據源,把表名作為變數,維護一個任務抽取一個使用者節點的所有資料

   (2)多個數據源單標批量操作:動態連結多個數據源,每個資料來源只對一個表做資料抽取

   (3)多個數據源多表批量操作:動態連結多個數據源,每個資料來源所有表做資料抽取

下面是單個數據源多表批量操作:

1.1  新建獲取表名Transfer

1) 新建Transfer所需的三個步驟分別是表輸入、欄位選擇、複製記錄到結果,並儲存到檔案:getTables.ktr如下圖所示:

     

       

2) 設定表輸入的引數,新增資料庫連結,和從PG抽取表名的指令碼,如下圖

   

3) 將指令碼中抽取的資料選擇欄位作為變數儲存到下一個步驟,因為這裡只有一個tablename,所以只要設定tablename就可以了,並且不用改名,如下圖:

   

4) 將選擇的欄位儲存到結果中,此步驟不用設定

5) 將上述操作按照步驟聯結起來並儲存,則完成當前Transfer設定

 

1.2  新建獲取結果Transfer

1)新建Transfer,包含如下兩個步驟,並儲存為getResults,如圖所示:

     

2)設定從結果獲取記錄的資料,將上一個transfer設定到結果的值取出來如下圖所示:

3)設定變數,將上一步取出來的結果,設定到變數中,為後續的操作從變數中讀取資料,這裡講讀取出來的tablename設定為TABLENAME,如圖所示:

4)將兩個過程聯結起來,並儲存,完成當前的transfer設定,如下圖所示

1.3  新建抽取資料Transfer

1) 新建一個transfer,包含資料表輸入和表輸出兩個步驟,並命名為getDatas,如下圖所示:

          

2) 新增表輸入的資料庫連結,如下圖所示:

3) 設定源資料庫資料獲取指令碼,因為這個步驟需要依賴上一個步驟設定的變數,因此這裡的指令碼的表名用${TABLENAME},即上一步設定的表名,並將替換SQL語句裡的變數打鉤。

4) 設定表輸入的資料庫連結資訊

5) 設定表輸入的其他屬性資訊,主要是設定目標模式和目標表,目標模式為public可省略,表是從前面傳入的變數名設定為${TABLENAME},並勾選批量插入,如下圖:

        

6) 將兩個步驟聯結起來並儲存:

1.4  建立資料抽取子Job

1) 因為資料抽取的流程是需要獲取第一個Transfer的表名,而第一個資料表名是一個列表,因此需要將資料抽取流程單獨建立一個job,job包含如下三個步驟:

         

2) 設定第一個轉換屬性,將其關聯到getResult轉換即可,為了方便區分相應的改下名字:

 

3) 設定第二個轉換屬性,將其關聯到getDatas轉換即可

4) 將三個步驟聯結起來,完成自job設定

1.5  建立資料抽取整個流程Job

1)  建立整體資料抽取的Job,該job包含三個部分,如下如所示:

2)  設定轉換步驟的屬性,將其關聯到getTables

  

3)  設定子Job屬性,將其關聯到jobDatas,並在高階中將一次執行一個結果勾選,如下圖:

4)  將各個步驟聯結起來,完成整個job建立,如下圖所示:

最後點選執行,即可全流程按照獲取的表名一個表的資料獲取。上傳的東西不知道哪兒去了