1. 程式人生 > >開源ETL工具之Kettle介紹

開源ETL工具之Kettle介紹

power 基本概念 lgpl hat free ipaddress 傳遞 高可用 apache

What

起源

Kettle是一個Java編寫的ETL工具,主作者是Matt Casters,2003年就開始了這個項目,最新穩定版為7.1。
2005年12月,Kettle從2.1版本開始進入了開源領域,一直到4.1版本遵守LGPL協議,從4.2版本開始遵守Apache Licence 2.0協議。
Kettle在2006年初加入了開源的BI公司Pentaho, 正式命名為:Pentaho Data Integeration,簡稱“PDI”。
自2017年9月20日起,Pentaho已經被合並於日立集團下的新公司: Hitachi Vantara。
總之,Kettle可以簡化數據倉庫的創建,更新和維護,使用Kettle可以構建一套開源的ETL解決方案。

架構

Kettle是一個組件化的集成系統,包括如下幾個主要部分:
1.Spoon:圖形化界面工具(GUI方式),Spoon允許你通過圖形界面來設計Job和Transformation,可以保存為文件或者保存在數據庫中。
也可以直接在Spoon圖形化界面中運行Job和Transformation,
2.Pan:Transformation執行器(命令行方式),Pan用於在終端執行Transformation,沒有圖形界面。
3.Kitchen:Job執行器(命令行方式),Kitchen用於在終端執行Job,沒有圖形界面。
4.Carte:嵌入式Web服務,用於遠程執行Job或Transformation,Kettle通過Carte建立集群。
5.Encr:Kettle用於字符串加密的命令行工具,如:對在Job或Transformation中定義的數據庫連接參數進行加密。
技術分享圖片

基本概念

1.Transformation:定義對數據操作的容器,數據操作就是數據從輸入到輸出的一個過程,可以理解為比Job粒度更小一級的容器,我們將任務分解成Job,然後需要將Job分解成一個或多個Transformation,每個Transformation只完成一部分工作。
2.Step:是Transformation內部的最小單元,每一個Step完成一個特定的功能。
3.Job:負責將Transformation組織在一起進而完成某一工作,通常我們需要把一個大的任務分解成幾個邏輯上隔離的Job,當這幾個Job都完成了,也就說明這項任務完成了。
4.Job Entry:Job Entry是Job內部的執行單元,每一個Job Entry用於實現特定的功能,如:驗證表是否存在,發送郵件等。可以通過Job來執行另一個Job或者Transformation,也就是說Transformation和Job都可以作為Job Entry。
5.Hop:用於在Transformation中連接Step,或者在Job中連接Job Entry,是一個數據流的圖形化表示。
技術分享圖片

在Kettle中Job中的JobEntry是串行執行的,故Job中必須有一個Start的JobEntry;Transformation中的Step是並行執行的。

Why

組件對比

目前,ETL工具的典型代表有:

  • 商業軟件:Informatica PowerCenter,IBM InfoSphere DataStage,Oracle Data Integrator,Microsoft SQL Server Integration Services等
  • 開源軟件:Kettle,Talend,Apatar,Scriptella等

純java編寫,可以跨平臺運行,綠色無需安裝,數據抽取高效穩定。
技術分享圖片
技術分享圖片

相對於傳統的商業軟件,Kettle是一個易於使用的,低成本的解決方案。

Spoon是基於SWT(SWT使用了本地操作系統的組件庫,性能更好,界面更符合本地操作系統的風格)開發的,支持多平臺:

  • Microsoft Windows: all platforms since Windows 95, including Vista
  • Linux GTK: on i386 and x86_64 processors, works best on Gnome
  • Apple‘s OSX: works both on PowerPC and Intel machines
  • Solaris: using a Motif interface (GTK optional)
  • AIX: using a Motif interface
  • HP-UX: using a Motif interface (GTK optional)
  • FreeBSD: preliminary support on i386, not yet on x86_64

Kettle使用場景

  • Migrating data between applications or databases 在應用程序或數據庫之間進行數據遷移
  • Exporting data from databases to flat files 從數據庫導出數據到文件
  • Loading data massively into databases 導入大規模數據到數據庫
  • Data cleansing 數據清洗
  • Integrating applications 集成應用程序

How

1.下載

https://community.hds.com/docs/DOC-1009855

也可以自己build,Maven項目架構。

mvn clean package -Drelease -Dmaven.test.skip=true

詳見:https://github.com/pentaho/pentaho-kettle

2.安裝

安裝JRE1.7+(Pan需要在JRE1.7+下運行)。
Kettle免安裝,在windows環境下,直接解壓到指定目錄即可。

3.實踐

(1)在Spoon中設計Transformation和Job
運行Transformation和Job有2種方式。
方式一:直接在Spoon中運行。
方式二:在控制臺終端運行(可以傳遞命令行參數),例如:

  • 使用Pan運行Transformation:Pan.bat /file C:\\Users\\chench9\\Desktop\\Tutorial\\hello.ktr
  • 使用Kitchen運行Job:Kitchen.bat /file C:\\Users\\chench9\\Desktop\\Tutorial\\hello.kjb list /norep

(2)運行結果Step Metrics解讀

  • Read: the number of rows coming from previous Steps.
  • Written: the number of rows leaving from this Step toward the next.
  • Input: the number of rows read from a file or table.
  • Output: the number of rows written to a file or table.
  • Errors: errors in the execution. If there are errors, the whole row will become red.

(3)Kettle Java API
可以通過Java API的方式,將Kettle與第三方應用程序集成。
Kettle本身不提供對外的REST API,但是有一個Step為REST Client。
引用了Kettle所依賴的lib包之後,可以通過Java API方式在第三方應用中運行Job或Transformation

(4)集群部署
Kettle集群是一個Master/Slave架構。
Kettle集群是通過Carte服務組建的,集群模式主要用於遠程執行Job。
本質上來講Carte就是一個Web服務,其實就是使用了一個嵌入式Jetty容器。
初次調用Carte HTTP服務時用戶名/密碼: cluster/cluster。

  • 啟動master節點

啟動master節點很簡單,直接啟動Carte服務即可,如:sh carte.sh localhost 8080
或者通過配置文件啟動Master節點,首先編輯Master配置內容如下:

<slave_config>
    <slaveserver>
        <name>master1</name>
        <hostname>moc.bankcomm.com</hostname>
        <port>8080</port>
        <username>cluster</username>
        <password>cluster</password>
        <master>Y</master>
    </slaveserver>
</slave_config>
  • 啟動slave節點

在Slave節點上添加配置文件:slave_dyn_8080.xml,編輯內容如下:

<slave_config>
    <masters>
        <slaveserver>
            <name>master1</name>
            <hostname>moc.bankcomm.com</hostname>
            <port>8080</port>
            <username>cluster</username>
            <password>cluster</password>
            <master>Y</master>
        </slaveserver>
    </masters>

    <report_to_masters>Y</report_to_masters>
    
    <slaveserver>
        <name>slave1-8080</name>
        <hostname>kettle.slave1</hostname>
        <port>8080</port>
        <username>cluster</username>
        <password>cluster</password>
        <master>N</master>
    </slaveserver>
</slave_config>

啟動slave節點:Carte.bat D:\\pdi-ce-8.1-SNAPSHOT\\data-integration\\slave_dyn_8080.xml

(5)Kettle內置的Step
https://wiki.pentaho.org/display/EAI/List+of+Available+Pentaho+Data+Integration+Plug-Ins Kettle插件

(6) 總結

  • 使用簡單,學習曲線平緩
  • 無需編寫SQL就可以實現ETL

註意事項

  • 運行Transformation或Job時,在Spoon中設置的環境變量在重啟之後需要重新設置;如果是命令行參數,在終端運行時作為參數傳遞即可。
  • 在使用Java API調用Job和Transformation時,除了需要引用kettle所依賴的lib包,在代碼中初始化Kettle運行時環境之前,需要添加插件。參考:https://stackoverflow.com/questions/44866152/pentaho-kettle-cant-run-transformation-due-to-plugin-missing
  • 在使用Java API運行Job和Transformation時,環境變量可以在2個地方設置:${user.home}/.kettle/kettle.properties,System.setProperty()
  • 在Transformation中類型為command line argument的參數在集成Kettle API的應用中可以通過System.setProperty()設置並傳遞

kettle的坑

1.集群化部署
(1)不能在<slaveserver>節點中使用<network_interface>替代<hostname>,否則啟動時報錯:

java.lang.NullPointerException
        at org.pentaho.di.core.Const.getIPAddress(Const.java:1775)
        at org.pentaho.di.www.SlaveServerConfig.checkNetworkInterfaceSetting(SlaveServerConfig.java:378)
        at org.pentaho.di.www.SlaveServerConfig.<init>(SlaveServerConfig.java:200)
        at org.pentaho.di.www.Carte.parseAndRunCommand(Carte.java:202)
        at org.pentaho.di.www.Carte.main(Carte.java:162)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.pentaho.commons.launcher.Launcher.main(Launcher.java:92)

(2)當集群中的slave節點失效之後,master不會更新slave列表。
雖然官方宣稱每隔30秒就會檢測slave的狀態,但是實際部署時發現master並不會更新slave列表。

2.高可用支持
3.如何避坑
4.基於開源版我們可以用來做什麽,如何實現定時調度,如何實現高可用
5.開源社區版本與企業版本主要區別是什麽?
企業版Kettle不是獨立的,而是集成在Pentaho Business Analytics商業套件中,作為ETL組件。在企業版中Kettle多一個Pentaho資源庫。

【參考資料】
http://www.pentaho.com/ Pentaho主頁
https://github.com/pentaho/pentaho-kettle Kettle源碼
https://wiki.pentaho.com/display/EAI/ 文檔(最新)
https://forums.pentaho.com/ Kettle論壇
《解決方案:使用PDI構建開源ETL解決方案 》

開源ETL工具之Kettle介紹