Kettle入門教程
最近做的項目用到了ETL工具Kettle,這個工具相當好用,可以將各種類型數據作為數據流,經過處理後再生成各種類型的數據。正如其名“水壺”,將各個地方的水倒進水壺裏,再用水壺倒入不同的容器。不過一來初學乍用,二來對此任務不是很感興趣,研究的不是很深入,可能是以一種不科學的方法使用的,但觀教程,常用的內容似乎也涉及到了,並且Y大說過,要善於總結,於是有了這篇,作為入門說明吧。
一、下載與安裝
官網地址
大概700~800M,下載好解壓縮即可。當然,要求JDK環境(似乎有自帶)
二、任務(.kjb)與轉換(.ktr)
Kettle工具的主界面-作業簡單地說,一個轉換就是一個ETL的過程,而作業則是多個轉換、作業的集合,在作業中可以對轉換或作業進行調度、定時任務等(據說定時不好用,可以通過其他方式,比如linux的crontab命令,不過實際使用中,這個指令也不大好使,有待查看日誌探明原因。)
我在實際過程中,寫的流程不是很復雜,當數據抽取需要多步驟時,分成多個轉換,在集合到一個作業裏順序擺放,然後執行即可,不放到作業裏的話,要對多個轉換依次執行命令,比較麻煩。
三、煎鍋、勺子、廚房
是不是莫名其妙,以為走錯了片場?然而這是幾個重要的工具名稱。
1)勺子-Spoon.bat/spoon.sh
圖形界面工具,就是啟動上圖主界面的命令行。這個界面應該是JavaFX做的。
這個用來在有圖形界面的系統下寫任務(如何通過命令行寫我不知道,並且我懷疑沒有這個可能……),如Windows,寫好後,也可以通過該工具進行執行,調試。這個工具最大的問題是啟動很慢,並且如果修改了數據庫連接的配置,只有重新啟動才能生效了。這時候就體現了命令行的優越性。
轉換窗口
簡單的轉換示例左邊有很多控件可供選擇,上圖展示了我在使用中經常用到的幾個控件。
-
執行SQL腳本
- 表輸入:通過查詢數據庫的表來獲取輸入數據流。該控件中也可以寫SQL
-
表輸出:將數據流映射到指定的表中。
在這裏,指定了數據庫連接(後敘)和目標表之後,可以勾選指定數據庫字段,如此下方的數據庫字段標簽的內容就成了可編輯狀態(因為表輸入和表輸出的數據表結構不可能完全一致,通過這樣可以將A表列對應到指定的B表列中) -
發送郵件:轉換完成後,通過指定的郵箱發送郵件到指定的聯系人。
2)廚房(Kitchen.bat/kitchen.sh)與煎鍋(Pan.bat/pan.sh)
這兩個指令都可以套用在下面這個命令上
./kichen.sh -file ./YourScirpts/demo.kjb
./pan.sh -file ./YourScripts/demo.ktr
作業腳本的後綴是kjb,轉換腳本的後綴是ktr
這是最簡單的執行方法,有時候,可能需要將日誌輸出到某個地方,可以加-log參數,不過我在實際使用中,是讓運維將指令運行結果日誌保存的,而不是通過這個工具,所以暫且忽略(不錯,能省事兒則省事兒……)
還有比較高級的用法,即命令行參數替換。在腳本中(比如上圖中,表輸入的那個地方),可以添加變量:
select * from testTable where date=${datetime}
並勾選控件下方的“替換SQL語句裏的變量”,保存,雙擊轉換界面空白處,打開轉換屬性設置窗口:
在命名參數標簽下填入命名參數名稱,使用如下命令:
./pan.sh -file YourScripts/test.ktr -param:datetime="‘2015-01-01‘"
實際應用中,通過python計算日期,再調用shell,即可以實現根據指定日期循環執行腳本了。
import datetime
import os
date1=datetime.datetime(2016,11,7)
date2=datetime.datetime(2016,11,4) #5號執行的任務應該處理4號的
while date1 > date2:
temp = date1- datetime.timedelta(days=1)
print "處理日期:>>>"+temp.strftime("%Y-%m-%d")+"~"+date1.stftime("%Y-%m-%d")
os.system("/usr/local/data-integration/pan.sh -file /usr/local/data-integration/Demo/test.ktr -param:date1=\"‘"+temp.strftime("%Y-%m-%d")+"‘\" -param:date2=\"‘"+date1.strftime("%Y-%m-%d")+"‘\"")
date1 = temp
print ">>>處理完成<<<"
四、設置數據庫
在實際使用中,用到了兩種方式,一個是直接配置在轉換中,一個是配置在jndi配置文件裏。
先說第一種:
這與其他工具連接數據庫沒有什麽不同,寫好改填的內容,點一下測試,如果沒有報錯,就沒問題了。配置好後,在上述過程中的數據庫連接就能看到了(PS,這個見面就是在數據庫連接下拉框右邊的新建打開的)
這種方式的優點是隨用隨配,如果需要改變鏈接,修改此處配置可以立即生效。缺點是如果轉換比較多了,一旦需要修改數據源,每個轉換都要進行改動,十分麻煩。所以還是通過配置文件更為方便些:
連接名稱是為了在轉換中好選擇進行填寫的,填什麽都行,我是與JNDI名稱相同。JNDI的配置文件在Kettle工具文件夾的根目錄下裏的simple-jndi裏:
為了方便,我加了不同的後綴以作區分,使用時再改名。真正生效的只有jdbc.properties,裏面內容如下:
看到這個突然想起來有件重要的事情沒有說,相關的數據庫連接驅動,要放在data-integration目錄下的lib文件夾內,否則測試連接報錯。
我這三個配置分別對應了只讀庫,中間庫,報表庫,具體配置不做贅述。如此在數據庫連接中,選擇JNDI,填入正確的JNDI名稱(如TBIN)即可使用。
這種方式的好處是在轉換中需要填寫的配置只有個名稱而已,修改起來也只需要改變配置,切換環境十分方便。缺點如前所言,如果修改了配置文件,還需要重啟spoon才能生效,然而這個過程頗為緩慢,本人8G的內存,開起來也得等個好幾分鐘。。。Java寫桌面應用,前途依然任重而道遠。好在有命令行的執行方式,可以解決這個問題。
總結
至此,我所會的差不多說完了,其實沒有什麽難度,很多內容可以通過控件上的字面描述理解。難在過程的設計以及sql的維護等,設計什麽的,我沒有操太多心,根據負責人的要求left join就over了→_→
在此過程中,學到了不少shell指令,甚至還寫了個python腳本,將我多年前學到的一丟丟python用到了實際中,還是頗感欣慰的。
以上這些應該能滿足基本要求了,實際上還有很多高級內容,比如將作業、轉換維護在數據庫中(配置資源庫),定時任務(雙擊作業視圖下的start控件即可看到),日誌輸出(指定輸出的內容,等級),我並沒有深究,感覺做這個已經超綱了,再深入就更沒意思了。(比起那些只要做了就做到完美的人,我真是太……然而偷懶下來的時光,我用來貢獻黑客派了,哈哈~)
出處:https://www.jianshu.com/p/4d8171150faf
===========================================================================
本文要點:Kettle的建立數據庫連接、使用kettle進行簡單的全量對比插入更新:kettle會自動對比用戶設置的對比字段,若目標表不存在該字段,則新插入該條記錄。若存在,則更新。
Kettle簡介:Kettle是一款國外開源的ETL工具,純java編寫,可以在Window、Linux、Unix上運行,數據抽取高效穩定。Kettle 中文名稱叫水壺,該項目的主程序員MATT 希望把各種數據放到一個壺裏,然後以一種指定的格式流出。Kettle這個ETL工具集,它允許你管理來自不同數據庫的數據,通過提供一個圖形化的用戶環境來描述你想做什麽,而不是你想怎麽做。Kettle中有兩種腳本文件,transformation和job,transformation完成針對數據的基礎轉換,job則完成整個工作流的控制。(引用百度百科)
1、Kettle的下載與安裝(在本文中使用的kettle版本為6.1.0.1-196)
kettle的最新下載地址:http://community.pentaho.com/projects/data-integration/
2、打開kettle。
首先解壓下載下來的壓縮包如:pdi-ce-6.1.0.1-196.zip
然後打開Spoon.bat,如圖所示:
打開後請耐心等待一會兒時間。
3、建立轉換。
在文件->新建裝換。
新建轉換後在左邊的主對象樹中建立DB連接用以連接數據庫。如圖所示:
建立數據庫連接的過程與其他數據庫管理軟件連接數據庫類似。
註意:在數據庫鏈接的過程中,可能會報某個數據庫連接找不到的異常。那是因為你沒有對應的數據庫鏈接驅動,請下載對應驅動後,放入kettle的lib文件夾。
4、簡單的數據表插入\更新
(1)新建表插入
在左邊的面板中選擇“核心對象”,在核心對象裏面選擇“輸入->表輸入”,用鼠標拖動到右邊面板。如圖所示:
雙擊拖過來的表,可以編輯表輸入。
選擇數據庫連接和編輯sql語句,在這一步可以點擊預覽,查看自己是否連接正確。
(2)通過插入\更新輸出到表。
在左邊面板中選擇核心對象、選擇“輸出->插入\更新”如圖所示:
編輯插入更新:
首先:表輸入連接插入更新。
選中表輸入,按住shift鍵,拖向插入更新。
然後:雙擊插入更新,編輯它。
到這裏基本上,這個轉換就要做完了,可以點擊運行查看效果,看是否有誤,這個要先保存了才能運行,可以隨意保存到任何一個地方。
5、使用作業控制上面裝換執行。
使用作業可以定時或周期性的執行轉換,新建一個作業。並從左邊面板拖入start 和轉換。
雙擊start可以編輯,可以設置執行時間等等
點開裝換,可以設置需要執行的轉換任務,比如可以執行上面我們做的轉換,XXX.ktr
最後點擊運行即可。
到這裏,一個簡單的通過作業調度的kettle就算做完了。
附錄:測試數據表
1 -- ---------------------------- 2 DROP TABLE IF EXISTS `student`; 3 CREATE TABLE `student` ( 4 `userId` int(11) NOT NULL AUTO_INCREMENT, 5 `userName` varchar(20) DEFAULT NULL, 6 `userage` int(11) DEFAULT NULL, 7 `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 8 PRIMARY KEY (`userId`) 9 ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; 10 11 -- ---------------------------- 12 -- Table structure for student2 13 -- ---------------------------- 14 DROP TABLE IF EXISTS `student2`; 15 CREATE TABLE `student2` ( 16 `userId` int(11) NOT NULL AUTO_INCREMENT, 17 `userName` varchar(20) DEFAULT NULL, 18 `userage` int(11) DEFAULT NULL, 19 `timestamp` timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ ON UPDATE CURRENT_TIMESTAMP, 20 PRIMARY KEY (`userId`) 21 ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
出處:https://www.cnblogs.com/qcsy/p/5553801.html
Kettle入門教程