ETL開源項目kettle總結

Kettle

1、ETL概述

ETL數據抽取Extract、轉換Transform清洗、加載Load到數據倉庫的過程,目的是將企業中的分散、零亂、標準不統一的數據整合到一起,爲企業的決策提供分析依據。ETL是BI項目重要的一個環節

數據抽取是指從源數據源系統抽取目的數據源系統需要的數據。實際應用中,數據源較多采用的是關係數據庫.

數據抽取的方式:

全量抽取類似於數據遷移或數據複製,它將數據源中的表或視圖的數據原封不動的從數據庫中抽取出來,並轉換成自己的ETL工具可以識別的格式。

增量抽取只抽取自上次抽取以來數據庫中要抽取的表中新增或修改的數據。在ETL 使用過程中,增量抽取較全量抽取應用更廣。如何捕獲變化的數據是增量抽取的關鍵。對捕獲方法一般有兩點要求:準確性,能夠將業務系統中的變化數據按一定的頻率準確地捕獲到;性能,不能對業務系統造成太大的壓力,影響現有業務。目前增量數據抽取中常用的捕獲變化數據的方法有:

(a) 觸發器方式(又稱快照式)

在要抽取的表上建立需要的觸發器,一般要建立插入、修改、刪除三個觸發器,每當源表中的數據發生變化,就被相應的觸發器將變化的數據寫入一個臨時表,抽取線程從臨時表中抽取數據,臨時表中抽取過的數據被標記或刪除。優點:數據抽取的性能高,ETL加載規則簡單,速度快,不需要修改業務系統表結構,可以實現數據的遞增加載。 缺點:要求業務表建立觸發器,對業務系統有一定的影響,容易對源數據庫構成威脅。

(b) 時間戳方式

它是一種基於快照比較的變化數據捕獲方式,在源表上增加一個時間戳字段,系統中更新修改表數據的時候,同時修改時間戳字段的值。當進行數據抽取 時,通過比較上次抽取時間與時間戳字段的值來決定抽取哪些數據。有的數據庫的時間戳支持自動更新,即表的其它字段的數據發生改變時,自動更新時間戳字段的 值。有的數據庫不支持時間戳的自動更新,這就要求業務系統在更新業務數據時,手工更新時間戳字段。

  • 優點:同觸發器方式一樣,時間戳方式的性能也比較好,ETL 系統設計清晰,源數據抽取相對清楚簡單,可以實現數據的遞增加載。
  • 缺點:時間戳維護需要由業務系統完成,對業務系統也有很大的傾入性(加入額外的時間戳字段),特別是對不支持時間戳的自動更新的數據庫,還要求業務系統進行額外的更新時間戳操作;另外,無法捕獲對時間戳以前數據的delete和update 操作,在數據準確性上受到了一定的限制。

(c) 全表刪除插入方式

每次ETL 操作均刪除目標表數據,由ETL 全新加載數據。

優點:ETL 加載規則簡單,速度快。缺點:對於維表加外鍵不適應,當業務系統產生刪除數據操作時,綜合數據庫將不會記錄到所刪除的歷史數據,不可以實現數據的遞增加載;同時對於目標表所建立的關聯關係,需要重新進行創建。

 

Kettle概述

Kettle是開源的ETL工具,java編寫,可以在Window、Linux、Unix上運行。允許管理來自不同數據庫的數據,通過提供一個圖形化的工具spoon進行操作。Kettle中有兩種腳本文件,轉換transformation和作業job,transformation完成針對數據的基礎轉換,job則完成整個工作流的控制。kettle(PDI)工具

Kettle是一個組件化的集成系統,包括如下幾個主要部分:

  • Spoon:圖形化界面工具(GUI方式),Spoon允許你通過圖形界面來設計Job和 Transformation,可以保存爲文件或者保存在數據庫中。也可以直接在Spoon圖形化界面中運行Job和Transformation,
  • Pan:Transformation執行器(命令行方式),Pan用於在終端執行Transformation,沒有圖形界面。
  • Kitchen:Job執行器(命令行方式),Kitchen用於在終端執行Job,沒有圖形界面。

Kettle基本概念

1) 轉換Transformation

Transformation(轉換)是由一系列被稱之爲step(步驟)的邏輯工作的網絡。轉換本質上是數據流。轉換是一組圖形化的數據轉換配置的邏輯結構。轉換的兩個相關的主要組成部分是step(步驟)和hops(節點連接)轉換文件的擴展名是.ktr

2) 步驟Step

Steps(步驟)是轉換的基礎模塊,比如一個文本文件輸入或者一個表輸出就是一個步驟。步驟的數據發送可以設置爲輪流發送和複製發送;輪流發送:將數據行依次發給每一個輸出跳;複製發送:將全部數據行發送給所有輸出跳。

在Kettle中,所有的步驟都以併發的方式執行,當轉換啓動後,所有的步驟都同時啓動,從它們的輸入跳中讀取數據,並把處理過的數據寫到輸出跳,直到輸入跳裏不再有數據,就中止步驟的運行。當所有的步驟都中止了,整個轉換就中止了。

3) 跳Hops

Hops(節點連接)是數據的通道,用於連接兩個步驟,使得元數據從一個步驟傳遞到另一個步驟。像似順序執行發生的,但事實並非如此。節點連接決定了貫穿在步驟之間的數據流,步驟之間的順序不是轉換執行的順序。當執行一個轉換時,每個步驟都以自己的線程啓動,並不斷的接受和推送數據。步驟是同步開啓和運行的,步驟的初始化的順序是不可知的。在一個轉換中,一個步驟可以有多個連接,數據流可以從一個步驟流到多個步驟。hops不僅允許數據從一個步驟流向另一個步驟,也決定了數據流的方向和所經步驟。如果一個步驟的數據輸出到了多個步驟,那麼數據既可以是複製的,也可以是分發的。

4)作業Job

作業包括一個或多個作業項,作業項以某種順序來執行。作業項:與轉換中的步驟類似,作業項也以圖標的方式圖形化展示。作業項之間可以傳遞結果對象。結果對象裏包含了數據行,它們不是以流的方式來傳遞的。而是等一個作業項執行完了,再傳遞給下一個作業項。默認情況下,所有的作業項都是以串行的方式執行的。作業跳:作業之間的連線稱爲作業跳。作業裏每個作業項的不同運行結果決定了作業的不同執行路徑。

Kettle使用回溯算法來執行所有的作業項。即執行作業中的某條路徑的某個節點時,要依次執行這個節點的所有子路徑,直到沒有再可以執行的子路徑,就返回該節點的上一個節點,再反覆該過程。注意:在作業中定義的跳是控制流,在轉換中定義的跳是數據流。

 

Kettle的基本使用

1)Xml,json類型數據抽取

Kettle xml抽取到csv格式可以 (設置好xmlpath節點路徑就可以,從子節點開始)

Kettle json抽取到csv格式可以 (設置好jsonpath節點路徑就可以,從子節點開始),嵌套json需要使用java腳本!

2)連接資源庫,各種不同數據庫抽取

  • Gbase to mysql (關係型之間千萬級數據抽取,性能調優加速導入)
  • Kettle表輸出主鍵亂序,無法記錄傳到第幾條,不適用傳輸中斷
  • Mysql to mongoDB (關係型和非關係型之間可以傳輸)

3)Kettle定時任務,利用windwos,linux操作系統自帶的定時任務

Windows使用自帶的定時任務, Windows執行kettke任務的.bat腳本(kitchen)

Linux環境定時任務使用crontab,執行kettke的.shell腳本(kitchen)

 

Kettle調度問題是一個缺陷

kettle作爲非常優秀的開源ETL工具得到了非常廣泛的使用,一般的使用的都是使用客戶端操作管理,但問題是當投入生產環境使用時,動輒上百或幾百個job需要管理,這時在使用客戶端管理已經很難完成了。

我所知道的解決方案有用命令行的調用的,操作麻煩,體驗很差(基於命令行上構架出來的一般都用Linux的crontab、或者是Windows下用定時器等);還有就是開發web端管理工具,kettle自帶了一個web端管理工具,界面極其簡陋不說,還很難用,基本無法投入生產環境使用。

Kettle集成開發web項目成爲商業可用

上述方法不能滿足後,我開始尋求第三方工具,發現其實調度界的產品還是有很多,有Control-M、TASKCTL等專注調度的老牌廠商;有外包項目集成的Moia、ETS、WFT、IBM集成的調度工具;也有開源的Oozie、Zeus、Azkaban。

挨個查看一下資料後,感覺taskctl應該算裏面比較簡單的,試用後taskctl,還不錯,他們家不僅僅對Kettle支持不錯,基本上市面上常見的數據庫、各種類似的大數據、ETL工具、各種腳本語言都有這不錯的支持力度,即使不支持的,也可以自己擴展。

Kettle性能調優

性能調優在整個工程中是非常重要的,主要分兩個方面:一方面是硬件調優,一方面是軟件調優。

1) 調整JVM大小進行性能優化

在Kettle定時任務中的Kitchen與Pan腳本中修改,參數參考:

  • -Xmx1024m:設置JVM最大可用內存爲1024M。
  • -Xms512m:設置JVM促使內存爲512m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配內存。
  • -Xmn2g:設置年輕代大小爲2G。整個JVM內存大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小爲64m,所以增大年輕代後,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。
  • -Xss128k:設置每個線程的堆棧大小。JDK5.0以後每個線程堆棧大小爲1M,以前每個線程堆棧大小爲256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。

2)調整提交(Commit)記錄數大小進行優化

如修改RotKang_Test01中的“表輸出”組件中的“提交記錄數量”參數進行優化,Kettle默認Commit數量爲:1000,可以根據數據量大小來設置Commitsize:1000~50000。

3) 調整記錄集合裏的記錄數

4)儘量使用數據庫連接池;提高批處理的commit size;儘量使用緩存,緩存儘量大一些(主要是文本文件和數據流)

5)儘量用sql;插入大量數據的時候儘量把索引刪掉;儘量避免使用update , delete操作,update會先delete後insert;

6)縮小輸入的數據集的大小,增量更新也是爲了這個目的;觀察kettle log生成的方式來了解你的ETL操作最慢的地方

7)在ETL過程中的索引需要遵循以下使用原則:

1、當插入的數據爲數據表中的記錄數量10%以上時,首先需要刪除該表的索引來提高數據的插入效率,當數據全部插入後再建立索引。

2、避免在索引列上使用函數或計算,在where子句中,如果索引列是函數的一部分,優化器將不使用索引而使用全表掃描。

3、避免在索引列上使用 NOT和 “!=”,索引只能告訴什麼存在於表中,而不能告訴什麼不存在於表中,當數據庫遇到NOT和 “!=”時,就會停止使用索引轉而執行全表掃描。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章