Kettle命令行使用說明

1.    KETTLE簡介
說到ETL開源項目,Kettle當屬翹首,項目名稱很有意思,水壺。按項目負責人Matt的說法:把各種數據放到一個壺裏,然後呢,以一種你希望的格式流出。呵呵,外國人都很有聯想力。
看了提供的文檔,然後對發佈程序的簡單試用後,可以很清楚得看到Kettle的四大塊:
1)    Chef——工作(job)設計工具(GUI方式)
2)    Kitchen——工作(job)執行器(命令行方式)
3)    Spoon——轉換(transform)設計工具(GUI方式)
4)    Span——轉換(trasform)執行器(命令行方式)


1.1.    Chef——工作(job)設計器
這是一個GUI工具,操作方式主要通過拖拖拉拉,勿庸多言,一看就會。
何謂工作?多個作業項,按特定的工作流串聯起來,開成一項工作。正如:我的工作是軟件開發。我的作業項是:設計、編碼、測試!先設計,如果成功,則編碼,否則繼續設計,編碼完成則開始設計,週而復始,作業完成。
1.1.1.    Chef中的作業項包括:
1)    轉換:指定更細的轉換任務,通過Spoon生成。通過Field來輸入參數;
2)    SQL:sql語句執行;
3)    FTP:下載ftp文件;
4)    郵件:發送郵件;
5)    檢查表是否存在;
6)    檢查文件是否存在;
7)    執行shell腳本:如dos命令。
8)    批處理:(注意:windows批處理不能有輸出到控制檯)。
9)    Job包:作爲嵌套作業使用。
10)    JavaScript執行:這個比較有意思,我看了一下源碼,如果你有自已的Script引擎,可以很方便的替換成自定義Script,來擴充其功能;
11)    SFTP:安全的Ftp協議傳輸;
12)    HTTP方式的上/下傳。
1.1.2.    工作流
如上文所述,工作流是作業項的連接方式。分爲三種:無條件,成功,失敗,爲了方便工作流使用,KETTLE提供了幾個輔助結點單元(也可將其作爲簡單的作業項):
Start單元:任務必須由此開始。設計作業時,以此爲起點。
OK單元:可以編制做爲中間任務單元,且進行腳本編制,用來控制流程。
ERROR單元:用途同上。
DUMMY單元:什麼都不做,主要是用來支持多分支的情況,文檔中有例子。
1.1.3.    存儲方式
支持XML存儲,或存儲到指定數據庫中。
一些默認的配置(如數據庫存儲位置……),在系統的用戶目錄下,單獨建立了一個.Kettle目錄,用來保存用戶的這些設置。
1.1.4.    LogView
可查看執行日誌。


1.2.    Kitchen——作業執行器
是一個作業執行引擎,用來執行作業。這是一個命令行執行工具,沒啥可講的,就把它的參數說明列一下。
1)    -rep:Repositoryname任務包所在存儲名
2)    -user:Repositoryusername執行人
3)    -pass:Repositorypassword執行人密碼
4)    -job:Thenameofthejobtolaunch任務包名稱
5)    -dir:Thedirectory(don'tforgettheleading/or\)
6)    -file:Thefilename(JobXML)tolaunch
7)    -level:Thelogginglevel(Basic,Detailed,Debug,Rowlevel,Error,Nothing)指定日誌級別
8)    -log:Theloggingfiletowriteto指定日誌文件
9)    -listdir:Listthedirectoriesintherepository列出指定存儲中的目錄結構。
10)    -listjobs:Listthejobsinthespecifieddirectory列出指定目錄下的所有任務
11)    -listrep:Listthedefinedrepositories列出所有的存儲
12)    -norep:Don'tlogintotherepository不寫日誌
嗯,居然不支持調度。看了一下文檔,建議使用操作系統提供的調度器來實現調度,比如:Windows可以使用它的任務計劃工具。


1.3.    Spoon——轉換過程設計器
GUI工作,用來設計數據轉換過程,創建的轉換可以由Pan來執行,也可以被Chef所包含,作爲作業中的一個作業項。
下面簡單列舉一下所有的轉換過程。(簡單描述,詳細的可見Spoon文檔)
1.3.1.    Input-Steps:輸入步驟
lTextfileinput:文本文件輸入
可以支持多文件合併,有不少參數,基本一看參數名就能明白其意圖。
lTableinput:數據表輸入
實際上是視圖方式輸入,因爲輸入的是sql語句。當然,需要指定數據源(數據源的定製方式在後面講一下)
lGetsysteminfo:取系統信息
就是取一些固定的系統環境值,如本月最後一天的時間,本機的IP地址之類。
lGenerateRows:生成多行。
這個需要匹配使用,主要用於生成多行的數據輸入,比如配合Addsequence可以生成一個指定序號的數據列。
lXBaseInput
lExcelInput
lXMLInput
這三個沒啥可講的,看看參數就明瞭。
1.3.2.    Output-Steps:輸出步聚
lTextfileoutput:文本文件輸出。這個用來作測試蠻好,呵呵。很方便的看到轉換的輸出。
lTableoutput:輸出到目的表。
lInsert/Update:目的表和輸入數據行進行比較,然後有選擇的執行增加,更新操作。
lUpdate:同上,只是不支持增加操作。
lXMLOutput:
1.3.3.    Look-up:查找操作
lDataBase
lStream
lProcedure
lDatabasejoin
1.3.4.    Transform轉換
lSelectvalues
對輸入的行記錄數據的字段進行更改(更改數據類型,更改字段名或刪除)數據類型變更時,數據的轉換有固定規則,可簡單定製參數。可用來進行數據表的改裝。
lFilterrows
對輸入的行記錄進行指定複雜條件的過濾。用途可擴充sql語句現有的過濾功能。但現有提供邏輯功能超出標準sql的不多。
lSortrows
對指定的列以升序或降序排序,當排序的行數超過5000時需要臨時表。
lAddsequence
爲數據流增加一個序列,這個配合其它Step(Generaterows,rowsjoin),可以生成序列表,如日期維度表(年、月、日)。
lDummy
不做任何處理,主要用來作爲分支節點。
lJoinRows
對所有輸入流做笛卡兒乘積。
lAggregate
聚合,分組處理
lGroupby
分組,用途可擴充sql語句現有的分組,聚合函數。但我想可能會有其它方式的sql語句能實現。
lJavaScriptvalue
使用mozilla的rhino作爲腳本語言,並提供了很多函數,用戶可以在腳本中使用這些函數。
lRowNormaliser
該步驟可以從透視表中還原數據到事實表,通過指定維度字段及其分類值,度量字段,最終還原出事實表數據。
lUniquerows
去掉輸入流中的重複行,在使用該節點前要先排序,否則只能刪除連續的重複行。
lCalculator
提供了一組函數對列值進行運算,用該方式比用戶自定義JAVASCRIPT腳本速度更快。
lMergeRows
用於比較兩組輸入數據,一般用於更新後的數據重新導入到數據倉庫中。
lAddconstants:
增加常量值。
lRowdenormaliser
同Normaliser過程相反。
lRowflattener
表扁平化處理,指定需處理的字段和扃平化後的新字段,將其它字段做爲組合Key進行扃平化處理。
1.3.5.    除了上述基本節點類型外還定義了擴展節點類型
lSPLITFIELDS
按指定分隔符拆分字段
lEXECUTESQLSCRIPT
執行SQL語句
lCUBEINPUT
lCUBEOUTPUT
1.3.6.    其它
l存儲方式:與Chef相同。
l數據源(Connection);見後。
lHops:setp連接起來,形成Hops。
lPluginsteptypes等節點:這個沒仔細看,不知如何製作Pluginstep。
lLogView:可查看執行日誌。


1.4.    Pan——轉換的執行工具
命令行執行方式,可以執行由Spoon生成的轉換任務。同樣,不支持調度。參數與Kitchen類似,可參見Pan的文檔。


1.5.    其它
Connection
可以配置多個數據源,在Job或是Trans中使用,這意味着可以實現跨數據庫的任務。支持大多數市面上流行的數據庫。


1.6.    個人感覺:(本人不成熟的看法)
1、轉換功能全,使用簡潔。作業項豐富,流程合理。但缺少調度。
2、java代碼,支持的數據源範圍廣,所以,跨平臺性較好。
3、從實際項目的角度看,和其它開源項目類似,主要還是程序員的思維,缺少與實際應用項目(專業領域)的更多接軌,當然,項目實施者的專注點可能在於一個平臺框架,而非實際應用(實際應用需要二次開發)。
4、看過了大多數源碼,發現源碼的可重用性不是太好(缺少大粒度封裝),有些關鍵部分好像有Bug。比如:個別class過於臃腫,線程實現的同步有問題。
5、提供的工具有些小錯,如參數的容錯處理。


1.7.    命令行執行實例
使用資源庫(repository)登錄時,默認的用戶名和密碼是admin/admin。
當job是存放在資源庫(一般資源庫都使用數據庫)中時,使用Kitchen.bat執行job時,需使用如下的命令行:
Kitchen.bat-repkettle-useradmin-passadmin-jobjob名
當job沒有存放在資源庫而存放在文件系統時,使用Kitchen.bat執行job時,需使用如下的命令行:
Kitchen.bat-norep-fileuser-transfer-job.kjb
可以使用命令行執行job後,就可以使用windows或linux的任務調度來定時執行任務了命令,在控制檯執行測試。
Bat文件實例如下:
@echo off 
rem 該批處理爲每小時開啓一個。需要在執行計劃中添加。
rem 僅適用於不怕開啓兩個任務重複抽取的JOB。否則可能會導致重複。

rem 隱藏執行的窗口,避免人爲關掉
rem if "%1"=="h" ( goto :begin )
rem start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit 
:begin


rem 設置環境變量。
rem set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_27
rem set CALASSPATH=%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;
rem set Path=%JAVA_HOME%\bin
rem 以下才是執行相關的內容。

rem 得到當前日期:日
set t_dd=%date:~8,2%
rem 得到當前時間:小時
rem set t_hh=%time:~0,2%

rem 設置等待時間 1000=1s
set t_sleep=1800000
rem KETTLE的路徑
set path_kettle=F:\ETL\data-integration
rem 日誌文件
set file_log=F:\ETL\Job_Log\DS_JB_30MIN%date:~0,4%%date:~5,2%%date:~8,2%.log
set file_sleep=F:\ETL\data-integration\sleep30MIN.vbs

rem 作業相關
rem 資源庫 JOB 路徑 用戶 密碼
set myrep=kettle
set myjob=DS_JB_30MIN
set mydir=/總體維護/J01_半小時任務
set myuser=admin
set mypass=password

f:
cd %path_kettle%

rem 循環
:myloop
echo 請不要關閉此窗口:正在執行kettle_every30MIN_job 30分鐘定時抽取
rem 執行KETTLE。
call kitchen -rep %myrep% -job %myjob% -dir %mydir% -user %myuser% -pass %mypass%>>%file_log%
rem 等待
echo wscript.sleep %t_sleep%>%file_sleep%
cscript //nologo %file_sleep%
rem 判斷是否當天?
if %t_dd% equ %date:~8,2% ( goto myloop )
rem 判斷是否當前小時?
if %t_tt% neq %time:~0,2% ( goto myloop )
echo 退出時間:%date:~0,10%%time% >>%file_log%
exit
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章