1. 程式人生 > >Kettle入門教程

Kettle入門教程

containe mage AD java data- .sh 示例 test username

最近做的項目用到了ETL工具Kettle,這個工具相當好用,可以將各種類型數據作為數據流,經過處理後再生成各種類型的數據。正如其名“水壺”,將各個地方的水倒進水壺裏,再用水壺倒入不同的容器。不過一來初學乍用,二來對此任務不是很感興趣,研究的不是很深入,可能是以一種不科學的方法使用的,但觀教程,常用的內容似乎也涉及到了,並且Y大說過,要善於總結,於是有了這篇,作為入門說明吧。

一、下載與安裝

官網地址
大概700~800M,下載好解壓縮即可。當然,要求JDK環境(似乎有自帶)

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

技術分享圖片 Kettle工具的主界面-作業

簡單地說,一個轉換就是一個ETL的過程,而作業則是多個轉換、作業的集合,在作業中可以對轉換或作業進行調度、定時任務等(據說定時不好用,可以通過其他方式,比如linux的crontab命令,不過實際使用中,這個指令也不大好使,有待查看日誌探明原因。)
我在實際過程中,寫的流程不是很復雜,當數據抽取需要多步驟時,分成多個轉換,在集合到一個作業裏順序擺放,然後執行即可,不放到作業裏的話,要對多個轉換依次執行命令,比較麻煩。

三、煎鍋、勺子、廚房

技術分享圖片

是不是莫名其妙,以為走錯了片場?然而這是幾個重要的工具名稱。

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

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

轉換窗口
技術分享圖片 簡單的轉換示例

左邊有很多控件可供選擇,上圖展示了我在使用中經常用到的幾個控件。

  • 執行SQL腳本
    :可以直接在控件裏寫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入門教程