轉載地址:https://www.cnblogs.com/gala1021/p/7814712.html
簡介
Kettle是一款國外開源的ETL工具,純java編寫,可以在Window、Linux、Unix上運行,綠色無需安裝,數據抽取高效穩定。
Kettle 中文名稱叫水壺,該項目的主程序員MATT 希望把各種數據放到一個壺里,然后以一種指定的格式流出。
Kettle這個ETL工具集,它允許你管理來自不同數據庫的數據,通過提供一個圖形化的用戶環境來描述你想做什么,而不是你想怎么做。
Kettle中有兩種腳本文件,transformation和job,transformation完成針對數據的基礎轉換,job則完成整個工作流的控制。
Kettle可以在http://kettle.pentaho.org/網站下載到。
術語
1. Transformation 轉換步驟,可以理解為將一個或者多個不同的數據源組裝成一條數據流水線。然后最終輸出到某一個地方,文件或者數據庫等。
2. Job 作業,可以調度設計好的轉換,也可以執行一些文件處理(比較,刪除等),還可以 ftp 上 傳,下載文件,發送郵件,執行 shell 命令等
3. Hop 連接轉換步驟或者連接 Job(實際上就是執行順序) 的連線 Transformation hop:主要表示數據的流向。從輸入,過濾等轉換操作,到輸出。
Job hop:可設置執行條件: 1, 無條件執行 2, 當上一個 Job 執行結果為 true 時執行 3, 當上一個 Job 執行結果為 false 時執行
應用場景
-
表視圖模式:這種情況我們經常遇到,就是在同一網絡環境下,我們對各種數據源的表數據進行抽取、過濾、清洗等,例如歷史數據同步、異構系統數據交互、數據對稱發布或備份等都歸屬於這個模式;傳統的實現方式一般都要進行研發(一小部分例如兩個相同表結構的表之間的數據同步,如果sqlserver數據庫可以通過發布/訂閱實現),涉及到一些復雜的一些業務邏輯如果我們研發出來還容易出各種bug;
-
前置機模式:這是一種典型的數據交換應用場景,數據交換的雙方A和B網絡不通,但是A和B都可以和前置機C連接,一般的情況是雙方約定好前置機的數據結構,這個結構跟A和B的數據結構基本上是不一致的,這樣我們就需要把應用上的數據按照數據標准推送到前置機上,這個研發工作量還是比較大的;
-
文件模式: 數據交互的雙方A和B是完全的物理隔離,這樣就只能通過以文件的方式來進行數據交互了,例如XML格式,在應用A中我們開發一個接口用來生成標准格式的XML,然后用優盤或者別的介質在某一時間把XML數據拷貝之后,然后接入到應用B上,應用B上在按照標准接口解析相應的文件把數據接收過來;
kettle的組成
tips:linux上執行job kitchen.sh -file=/PRD/updateWarehouse.kjb -level=Minimal
執行轉換 pan.sh -file=/PRD/updateWarehouse.kjb -level=Minimal
Transformation組件樹介紹
Transformation中的節點介紹如下:
- Main Tree:菜單列出的是一個transformation中基本的屬性,可以通過各個節點來查看。
- DB連接:顯示當前transformation中的數據庫連接,每一個transformation的數據庫連接都需要單獨配置。
- Steps:一個transformation中應用到的環節列表
- Hops:一個transformation中應用到的節點連接列表 核心對象菜單列出的是transformation中可以調用的環節列表,可以通過鼠標拖動的方式對環節進行添加。
- Input:輸入環節
- Output:輸出環節
- Lookup:查詢環節
- Transform:轉化環節
- Joins:連接環節
- Scripting:腳本環節
Job組件樹介紹
Job中的節點介紹如下:
- Main Tree:列出的是一個Job中基本的屬性,可以通過各個節點來查看。 DB連接:顯示當前Job中的數據庫連接,每一個Job的數據庫連接都需要單獨配置。
- Job entries/作業項目:一個Job中引用的環節列表 核心對象菜單列出的是Job中可以調用的環節列表,可以通過鼠標拖動的方式對環節進行添加。 每一個環節可以通過鼠標拖動來將環節添加到主窗口中。 並可通過shift+鼠標拖動,實現環節之間的連接。
經常遇到問題:
1. 如何連接資源庫?
如果沒有則創建資源庫
2. 如何連接數據庫?
在連接數據庫之前,首先需要保證當前在一個transform(轉換)頁面,然后點擊左側選項欄中的“主對象樹”,然后右鍵點擊“DB連接”,選擇“新建”。
當然也可以設置一些其他的連接屬性,如zeroDateTimeBehavior=round&characterEncoding=utf8。
3. 如何解決數據庫連接更新不及時問題?
有時候我們數據庫中的表的字段進行了更新(增加或刪除字段),但是在使用“表輸入”控件的“獲取SQL語句”功能是會發現的到的字段還是原來的字段,這是由於緩存造成的,需要進行緩存清理。
4. 如何解決Unable to read file錯誤?
有時候我們在文件夾中將Job或Transform移動到其他目錄之后,執行時會出現Unable to read file錯誤。然后就進入到了當前Transform的配置頁面。修改配置中的目錄即可。
5. 如何解決tinyint類型數據丟失問題?
在Kettle使用JDBC連接MySQL時,對於表中數據類型為tinyint的字段,讀取時有可能會將其轉為bool類型,這有可能造成數據丟失。例如,有一個叫status名字的tinyint類型字段,取值有三種:0、1、2。kettle讀取之后很可能將0轉為false,1、2都轉為true。輸出時,將false轉為0,true轉為1,這樣就會造成元數據中status為2的數據被錯誤的賦值為1。 解決這個問題時,可以在讀取元數據時將status轉為int或char。比如SELECT CAST(status as signed) as status FROM <table_name>或SELECT CAST(status as char) as status FROM <table_name>。