1. 程式人生 > >ETL工具Kettle

ETL工具Kettle

轉載自 https://www.cnblogs.com/SunHuaJ/p/7593239.html

ETL是EXTRACT(抽取)、TRANSFORM(轉換)、LOAD(載入)的簡稱,實現資料從多個異構資料來源載入到資料庫或其他目標地址,是資料倉庫建設和維護中的重要一環也是工作量較大的一塊。當前知道的ETL工具有informatica, datastage,kettle,ETL Automation,sqoop,SSIS等等。這裡我們聊聊kettle的學習吧(如果你有一定的kettle使用,推薦看看Pentaho Kettle解決方案,這裡用kettle實踐kimball的資料倉庫理論。)。

  內容有:認識kettle、安裝kettle、簡單入門例項、進階例項、Linux中kettle部署、kettle發郵件、常見錯誤

  認識kettle

  kettle是純java開發,開源的etl工具。可以在Linux、windows、unix中執行。有圖形介面,也有命令指令碼還可以二次開發。(官方社群:http://forums.pentaho.com/;官網wiki:http://wiki.pentaho.com/display/COM/Community+Wiki+Home;原始碼地址:https://github.com/pentaho/pentaho-kettle)

  安裝kettle

  1、kettle是基於java開發的,所以需要java環境(下載jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html)

  

  2、kettle使用時,需要訪問相關的關係型資料庫,則需要下載對應的連結驅動。比如我們訪問MySQL,則下載相應的驅動解壓後放入kettle檔案的lib目錄下

  

  3、下載kettle並解壓到自定義位置。kettle其實是以前的叫法,現在官方稱為:PDI(Pentaho Data Integeration)。在windows中,雙擊目錄中的Spoon.bat啟動kettle.

  

  簡單的kettle例項

   1、新建作業/轉換(功能區:檔案 --> 新建 --> 作業;新建-->轉換)

    一個作業(job,檔案以kjb結尾)的主體是轉換(transform,以ktr結尾),job主要來設定排程,可以有影子拷貝,任一拷貝資訊修改所有拷貝的都被修改;transform做主體的內容,控制元件名稱唯一。

  2、三個控制元件(start、轉換、成功)和流程線(hop);

    start:job開始的地方,可以設定開始的時間、頻率、週期等(但要求kettle不能關閉,有點挫)

    轉換:後續詳解

    成功:job結束

    流程線:關聯兩個控制元件(實體),指定資料流。同時還可以設定是否可用、分發模式、錯誤輸出等;新增方式:按住shift進行滑鼠拖動

    

  3、轉換的工作

    新建的轉換:job中需引用該轉換檔案

    加入我們現在要同步MySQL中的一張表。在轉換中要有輸入和輸出。

    

    > 表輸入:先配置連結(完成後測試一下是否OK),再輸入查詢sql(比如:select id from tab2 limit 10;)

    

    >excel輸出。,指定輸出路徑

    

    > 完成轉換的配置後儲存,在job中引用儲存的檔案。我們來跑一下吧~

    

    

    > 完成,結束!

     進階例項:

    百度上看到了一篇關於kettle的作業,但是沒有詳細的過程。這裡以此說明,全圖過程如下。

    

    作業說明:生成 100 個隨機數,隨機數取值於[0,100)之間, 計算小於等於 50 的隨機數個數和 大於50 的隨機數個 數。 並把這兩個統計數字放在資料庫表的一行的兩列中, 即輸出的結果有一行,一行包括兩列,每列是一個統 計值。

    第一步:生成隨機數(輸入-->生成隨機數;需要生成100個隨機數,右擊控制元件,選擇"改變開始開始...數量"為100)

    

    第二步:增加常量(轉換-->增加常量;給變數取個名稱,型別和值。)

    

    第三步:計算器(轉換-->計算器;給出你的計算邏輯和計算出的欄位;)

    

    第四步:兩個分支,一個輸出;一個過濾;輸出指定Excel,並執行資料傳送模式(√:複製傳送模式)

    第五步:設定過濾(流程-->過濾記錄);並雙擊控制元件填寫對應的條件;

    

    第六步:分組(統計-->分組),雙擊控制元件後有兩個需要關注,一個是分組(相當於group by);一個是聚合(相當於count、sum等函式)

     第七步:記錄關聯(連線-->記錄關聯(笛卡爾輸出));這是一個join操作,但是沒有on條件;但是控制元件中提供了sql中where條件的刷選

     

    第八步:輸出

    Linux上部署kettle任務

    kettle的"開始"控制元件雖然可以進行排程,但要求程式一直執行。在實際工作中通常在windos中測試,放到Linux中以crontab的方式進行排程。在Linux中以kitchen.sh執行job任務,pan.sh執行transform任務;這裡我們以上面為例項,如何在Linux中進行部署。

    第一步:通過WinSCP將kettle拷貝到Linux中,在拷貝路徑中執行. kitchen.sh ,如果有參考訊息輸出則沒有問題

    

    第二步:對於已在windos中執行成功的地址、檔名、使用者等引數進行變數替換。執行export KETTLE_HOME=/home/shj,會生成/home/shj/.kettle目錄,通過編輯目錄下的kettle.properties檔案來設定變數。例項中,我們僅僅需要替換兩個輸出檔案的地址為變數即可。

    

    第三步:修改kettle目錄下的.sh檔案許可權為可執行(chmod a+x  *.sh);並執行檔案。

    

    這裡說明:/norep:表示不往資源庫中寫日誌,Do not log into the repository

           /file:使用檔案,The filename (Job XML) to launch

    第四步:驗證結果。

    

     kettle中傳送郵件

     kettle傳送郵件還是比較簡單的,我們需要一個郵件傳送的控制元件和對應的賬號密碼等自有資訊

    簡單的流程:

    

    需要配置傳送郵件控制元件:

    

    

    這樣執行後,郵件就傳送出去了。那麼如何在kettle生產中利用郵件功能呢?我們可以將kettle的轉換資訊、統計資訊、錯誤資訊以檔案的形式放入到指定的位置(或形成指定的引數),使用郵件以附件形式傳送這些資訊。

    流程:

    

    1、這裡我們新增控制元件:新增檔案到結果檔案中;配置轉換中的輸出的檔案

    2、傳送郵件中我們增加附件的配置,如下圖

    

    補充:如果覺得kettle傳送的正文資訊太多,可以配置郵件資訊中,只發送郵件註釋(註釋資訊需要自己寫,如果是動態的話需要開發)

    

    常見錯誤

    第一種:Timestamp:Unable to get timestamp from resultset at index 3**,如圖。這個錯誤需要在db連結的選線中設定命令引數zeroDateTimeBehavior(值:convertToNull  )

    

    

    第二種:欄位的空被替換成了null值。這是kettle預設的設定,需要我們在kettle.properties中增加設定(KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL=Y)。

    

    補充,在設計流程時我們並不希望出錯了作業就停止了,而是繼續執行並將錯誤資訊以某種方式反饋出來。這時,我們可以通過“定義錯誤處理”來實現。

    

    並將錯誤資訊輸出,供後續引用。