Kettle是一款國外開源的ETL工具,純java編寫,能夠在Window、Linux、Unix上運行,綠色無需安裝,數據抽取高效穩定。java
Kettle 中文名稱叫水壺,該項目的主程序員MATT 但願把各類數據放到一個壺裏,而後以一種指定的格式流出。 linux
Kettle這個ETL工具集,它容許你管理來自不一樣數據庫的數據,經過提供一個圖形化的用戶環境來描述你想作什麼,而不是你想怎麼作。 程序員
Kettle中有兩種腳本文件,transformation和job,transformation完成針對數據的基礎轉換,job則完成整個工做流的控制。 sql
Kettle能夠在http://kettle.pentaho.org/網站下載到。 shell
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上在按照標準接口解析相應的文件把數據接收過來;
tips:linux上執行job kitchen.sh -file=/PRD/updateWarehouse.kjb -level=Minimal
執行轉換 pan.sh -file=/PRD/updateWarehouse.kjb -level=Minimal
Transformation中的節點介紹以下:
Job中的節點介紹以下:
常常遇到問題:
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、一、2。kettle讀取以後極可能將0轉爲false,一、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>