Kettle入門教程

最近作的項目用到了ETL工具Kettle,這個工具至關好用,能夠將各類類型數據做爲數據流,通過處理後再生成各類類型的數據。正如其名「水壺」,將各個地方的水倒進水壺裏,再用水壺倒入不一樣的容器。不過一來初學乍用,二來對此任務不是很感興趣,研究的不是很深刻,多是以一種不科學的方法使用的,但觀教程,經常使用的內容彷佛也涉及到了,而且Y大說過,要善於總結,因而有了這篇,做爲入門說明吧。javascript

1、下載與安裝

官網地址
大概700~800M,下載好解壓縮便可。固然,要求JDK環境(彷佛有自帶)html

2、任務(.kjb)與轉換(.ktr)

 
Kettle工具的主界面-做業

簡單地說,一個轉換就是一個ETL的過程,而做業則是多個轉換、做業的集合,在做業中能夠對轉換或做業進行調度、定時任務等(聽說定時很差用,能夠經過其餘方式,好比linux的crontab命令,不過實際使用中,這個指令也不大好使,有待查看日誌探明緣由。)
我在實際過程當中,寫的流程不是很複雜,當數據抽取須要多步驟時,分紅多個轉換,在集合到一個做業裏順序擺放,而後執行便可,不放到做業裏的話,要對多個轉換依次執行命令,比較麻煩。java

3、煎鍋、勺子、廚房

 
 

是否是莫名其妙,覺得走錯了片場?然而這是幾個重要的工具名稱。python

1)勺子-Spoon.bat/spoon.sh

圖形界面工具,就是啓動上圖主界面的命令行。這個界面應該是JavaFX作的。
這個用來在有圖形界面的系統下寫任務(如何經過命令行寫我不知道,而且我懷疑沒有這個可能……),如Windows,寫好後,也能夠經過該工具進行執行,調試。這個工具最大的問題是啓動很慢,而且若是修改了數據庫鏈接的配置,只有從新啓動才能生效了。這時候就體現了命令行的優越性。linux

轉換窗口
 
簡單的轉換示例

左邊有不少控件可供選擇,上圖展現了我在使用中常常用到的幾個控件。程序員

  • 執行SQL腳本:能夠直接在控件裏寫SQL,並指定執行的庫。
 
 
  • 表輸入:經過查詢數據庫的表來獲取輸入數據流。該控件中也能夠寫SQL
 
 
  • 表輸出:將數據流映射到指定的表中。
     
     

    在這裏,指定了數據庫鏈接(後敘)和目標表以後,能夠勾選指定數據庫字段,如此下方的數據庫字段標籤的內容就成了可編輯狀態(由於表輸入和表輸出的數據表結構不可能徹底一致,經過這樣能夠將A表列對應到指定的B表列中)
  • 發送郵件:轉換完成後,經過指定的郵箱發送郵件到指定的聯繫人。
     
     

2)廚房(Kitchen.bat/kitchen.sh)與煎鍋(Pan.bat/pan.sh)

這兩個指令均可以套用在下面這個命令上sql

./kichen.sh -file ./YourScirpts/demo.kjb
./pan.sh -file ./YourScripts/demo.ktr

做業腳本的後綴是kjb,轉換腳本的後綴是ktr
這是最簡單的執行方法,有時候,可能須要將日誌輸出到某個地方,能夠加-log參數,不過我在實際使用中,是讓運維將指令運行結果日誌保存的,而不是經過這個工具,因此暫且忽略(不錯,能省事兒則省事兒……)
還有比較高級的用法,即命令行參數替換。在腳本中(好比上圖中,表輸入的那個地方),能夠添加變量:shell

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 ">>>處理完成<<<"

4、設置數據庫

在實際使用中,用到了兩種方式,一個是直接配置在轉換中,一個是配置在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則完成整個工做流的控制。(引用百度百科)

一、Kettle的下載與安裝(在本文中使用的kettle版本爲6.1.0.1-196)

  kettle的最新下載地址:http://community.pentaho.com/projects/data-integration/

二、打開kettle。

  首先解壓下載下來的壓縮包如:pdi-ce-6.1.0.1-196.zip

  而後打開Spoon.bat,如圖所示:

  

  打開後請耐心等待一下子時間。

三、創建轉換。

  在文件->新建裝換。

  新建轉換後在左邊的主對象樹中創建DB鏈接用以鏈接數據庫。如圖所示:

  

  創建數據庫鏈接的過程與其餘數據庫管理軟件鏈接數據庫相似。

  注意:在數據庫連接的過程當中,可能會報某個數據庫鏈接找不到的異常。那是由於你沒有對應的數據庫連接驅動,請下載對應驅動後,放入kettle的lib文件夾。

四、簡單的數據表插入\更新

  (1)新建表插入

  在左邊的面板中選擇「核心對象」,在覈心對象裏面選擇「輸入->表輸入」,用鼠標拖動到右邊面板。如圖所示:

 

 

 

  雙擊拖過來的表,能夠編輯表輸入。

  選擇數據庫鏈接和編輯sql語句,在這一步能夠點擊預覽,查看本身是否鏈接正確。

 

  (2)經過插入\更新輸出到表。

  在左邊面板中選擇核心對象、選擇「輸出->插入\更新」如圖所示:

 

  編輯插入更新:

  首先:表輸入鏈接插入更新。

    選中表輸入,按住shift鍵,拖向插入更新。

  而後:雙擊插入更新,編輯它。

 

  到這裏基本上,這個轉換就要作完了,能夠點擊運行查看效果,看是否有誤,這個要先保存了才能運行,能夠隨意保存到任何一個地方。

五、使用做業控制上面裝換執行。

  使用做業能夠定時或週期性的執行轉換,新建一個做業。並從左邊面板拖入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

相關文章
相關標籤/搜索