ETL工具--kettle篇(17.10.09更新)


  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)。

    

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

    

    並將錯誤信息輸出,供后續引用。

    

 

原創博客,轉載請注明出處!歡迎郵件溝通:shj8319@sina.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM