本系列文章主要索引如下:
一、ETL利器Kettle實戰應用解析系列一【Kettle使用介紹】
二、ETL利器Kettle實戰應用解析系列二 【應用場景和實戰DEMO下載】
三、ETL利器Kettle實戰應用解析系列三 【ETL後臺進程執行配置方式】
本文主要閱讀目錄如下:
ETL(Extract-Transform-Load的縮寫,即數據抽取、轉換、裝載的過程),對於企業或行業應用來說,我們經常會遇到各種數據的處理,轉換,遷移,所以瞭解並掌握一種etl工具的使用,必不可少,這裏我介紹一個我在工作中使用了3年左右的ETL工具Kettle,本着好東西不獨享的想法,跟大家分享碰撞交流一下!在使用中我感覺這個工具真的很強大,支持圖形化的GUI設計界面,然後可以以工作流的形式流轉,在做一些簡單或複雜的數據抽取、質量檢測、數據清洗、數據轉換、數據過濾等方面有着比較穩定的表現,其中最主要的我們通過熟練的應用它,減少了非常多的研發工作量,提高了我們的工作效率,不過對於我這個.net研發者來說唯一的遺憾就是這個工具是Java編寫的。
Kettle是一款國外開源的ETL工具,純java編寫,可以在Window、Linux、Unix上運行,綠色無需安裝,數據抽取高效穩定。
Kettle 中文名稱叫水壺,該項目的主程序員MATT 希望把各種數據放到一個壺裏,然後以一種指定的格式流出。
Kettle這個ETL工具集,它允許你管理來自不同數據庫的數據,通過提供一個圖形化的用戶環境來描述你想做什麼,而不是你想怎麼做。
Kettle中有兩種腳本文件,transformation和job,transformation完成針對數據的基礎轉換,job則完成整個工作流的控制。
3、1 安裝java JDK
1)首先到官網上下載對應JDK包,JDK1.5或以上版本就行;
2)安裝JDK;
3)配置環境變量,附配置方式:
安裝完成後,還要對它進行相關的配置纔可以使用,先來設置一些環境變量,對於Java來說,最需要設置的環境變量是系統路徑變量path。
(1)要打開環境變量的設置窗口。右擊“我的電腦”,在彈出的快捷菜單中選擇“屬性”選項,進入“系統屬性”對話框,如圖所示。選擇“高級”標籤,進入“高級”選項卡,再單擊“環境變量”按鈕,進入“環境變量”對話框,如圖所示:
(2)在“Administrator的用戶變量”列表框中,選擇變量PATH,待其所在行變高亮後,單擊“編輯”按鈕,如圖所示。
(3)在彈出的“編輯系統變量”對話框中,將JDK安裝路徑下的bin目錄路徑設置到Path變量中,如圖所示。
編輯完後,單擊“確定”按鈕,進行保存,環境變量Path的設置就正式完成。
注意:設置Path變量的路徑,必須是JDK安裝目錄中的bin目錄,有時候在JDK安裝目錄的同一層會有JRE的安裝目錄,因此請謹慎選取相關路徑,避免將路徑設置成JRE目錄下的bin目錄。
3、2 測試JDK配置是否成功
設置好環境變量後,就可以對剛設置好的變量進行測試,並檢測Java是否可以運行。
(1)單擊“開始”按鈕,選擇“運行”選項,在“運行”對話框中輸入cmd命令。
(2)之後單擊“確定”按鈕,打開命令行窗口。
(3)在光標處輸入:javac命令,按下Enter鍵執行,即可看到測試結果
3、3 運行Kettle
|
Main Tree菜單列出的是一個transformation中基本的屬性,可以通過各個節點來查看。
DB連接:顯示當前transformation中的數據庫連接,每一個transformation的數據庫連接都需要單獨配置。
Steps:一個transformation中應用到的環節列表
Hops:一個transformation中應用到的節點連接列表 |
Core Objects菜單列出的是transformation中可以調用的環節列表,可以通過鼠標拖動的方式對環節進行添加。
Input:輸入環節 Output:輸出環節 Lookup:查詢環節 Transform:轉化環節 Joins:連接環節 Scripting:腳本環節 |
類別 |
環節名稱 |
功能說明 |
Input |
文本文件輸入 |
從本地文本文件輸入數據 |
表輸入 |
從數據庫表中輸入數據 |
|
獲取系統信息 |
讀取系統信息輸入數據 |
|
Output |
文本文件輸出 |
將處理結果輸出到文本文件 |
表輸出 |
將處理結果輸出到數據庫表 |
|
插入/更新 |
根據處理結果對數據庫表機型插入更新,如果數據庫中不存在相關記錄則插入,否則爲更新。會根據查詢條件中字段進行判斷 |
|
更新 |
根據處理結果對數據庫進行更新,若需要更新的數據在數據庫表中無記錄,則會報錯停止 |
|
刪除 |
根據處理結果對數據庫記錄進行刪除,若需要刪除的數據在數據庫表中無記錄,則會報錯停止 |
|
Lookup |
數據庫查詢 |
根據設定的查詢條件,對目標表進行查詢,返回需要的結果字段 |
流查詢 |
將目標表讀取到內存,通過查詢條件對內存中數據集進行查詢 |
|
調用DB存儲過程 |
調用數據庫存儲過程 |
|
Transform |
字段選擇 |
選擇需要的字段,過濾掉不要的字段,也可做數據庫字段對應 |
過濾記錄 |
根據條件對記錄進行分類 |
|
排序記錄 |
將數據根據某以條件,進行排序 |
|
空操作 |
無操作 |
|
增加常量 |
增加需要的常量字段 |
|
Scripting |
Modified Java Script Value |
擴展功能,編寫JavaScript腳本,對數據進行相應處理 |
Mapping |
映射(子轉換) |
數據映射 |
Job |
Sat Variables |
設置環境變量 |
Get Variables |
獲取環境變量 |
|
Main Tree菜單列出的是一個Job中基本的屬性,可以通過各個節點來查看。
DB連接:顯示當前Job中的數據庫連接,每一個Job的數據庫連接都需要單獨配置。
Job entries:一個Job中引用的環節列表
|
Job entries菜單列出的是Job中可以調用的環節列表,可以通過鼠標拖動的方式對環節進行添加。
每一個環節可以通過鼠標拖動來將環節添加到主窗口中。
並可通過shift+鼠標拖動,實現環節之間的連接。 |
類別 |
環節名稱 |
功能說明 |
Job entries |
START |
開始 |
DUMMY |
結束 |
|
Transformation |
引用Transformation流程 |
|
Job |
引用Job流程 |
|
Shell |
調用Shell腳本 |
|
SQL |
執行sql語句 |
|
FTP |
通過FTP下載 |
|
Table exists |
檢查目標表是否存在,返回布爾值 |
|
File exists |
檢查文件是否存在,返回布爾值 |
|
Javascript |
執行JavaScript腳本 |
|
Create file |
創建文件 |
|
Delete file |
刪除文件 |
|
Wait for file |
等待文件,文件出現後繼續下一個環節 |
|
File Compare |
文件比較,返回布爾值 |
|
Wait for |
等待時間,設定一段時間,kettle流程處於等待狀態 |
|
Zip file |
壓縮文件爲ZIP包 |
本文主要閱讀目錄如下:
這裏簡單概括一下幾種具體的應用場景,按網絡環境劃分主要包括:
-
表視圖模式:這種情況我們經常遇到,就是在同一網絡環境下,我們對各種數據源的表數據進行抽取、過濾、清洗等,例如歷史數據同步、異構系統數據交互、數據對稱發佈或備份等都歸屬於這個模式;傳統的實現方式一般都要進行研發(一小部分例如兩個相同表結構的表之間的數據同步,如果sqlserver數據庫可以通過發佈/訂閱實現),涉及到一些複雜的一些業務邏輯如果我們研發出來還容易出各種bug;
-
前置機模式:這是一種典型的數據交換應用場景,數據交換的雙方A和B網絡不通,但是A和B都可以和前置機C連接,一般的情況是雙方約定好前置機的數據結構,這個結構跟A和B的數據結構基本上是不一致的,這樣我們就需要把應用上的數據按照數據標準推送到前置機上,這個研發工作量還是比較大的;
-
文件模式: 數據交互的雙方A和B是完全的物理隔離,這樣就只能通過以文件的方式來進行數據交互了,例如XML格式,在應用A中我們開發一個接口用來生成標準格式的XML,然後用優盤或者別的介質在某一時間把XML數據拷貝之後,然後接入到應用B上,應用B上在按照標準接口解析相應的文件把數據接收過來;
綜上3種模式如果我們都用傳統的模式無疑工作量是巨大的,那麼怎麼做才能更高效更節省時間又不容易出錯呢?答案是我們可以用一下Kettle-_-!
2、1 實例1:數據庫TestA中的UserA表到數據庫TestB的UserB表
1)爲方便演示,我這邊把Sql腳本貼出來,大家直接複製在sqlserver中運行即可,sql腳本如下:
2)Kettle實現方式
功能簡述:數據庫TestA中的UserA表到數據庫TestB的UserB表;
實現流程:建立一個轉換和一個作業Job;
A:建立一個轉換:打開Kettle.exe,選擇沒有資源庫,進入主界面,新建一個轉換,轉換的後綴名爲ktr,轉換建立的步驟如下:
步驟1:創建DB連接,選擇新建DB連接,如下圖,我們輸入相應的Sqlserver配置信息之後點擊Test按鈕測試是否配置正確!
我們需要建立兩個DB連接,分別爲TestA和TestB;
步驟2:建立步驟和步驟關係,點擊核心對象,我們從步驟樹中選擇【表輸入】,如下圖,這樣拖拽一個表輸入之後,我們雙擊表輸入之後,我們自己可以隨意寫一個sql語句,這個語句表示可以在這個庫中隨意組合,只要sql語句沒有錯誤即可,我這裏只是最簡單的把TestA中的所有數據查出來,語句爲select * from usersA。
接下來我們創建另外一個步驟【插入/ 更新】,然後在【表輸入】上同時按住shift鍵和鼠標左鍵滑向【插入/ 更新】,這樣建立兩個步驟之間的連接,【插入/ 更新】執行的邏輯是如果UserA表中的記錄在UserB中不存在那麼就插入,如果存在就更新,如下圖,在插入更新中我們可以做一些關鍵條件和字段映射,這裏我們是最簡單的!點擊保存,把我們建立的轉換保存一下。
建立好轉換之後,我們可以直接運行這個轉換,檢查一下是否有錯,如圖,有錯誤都會在下面的控制檯上輸出。
B:如果我們需要讓這個轉換定時執行怎麼辦呢,那麼我們需要建立一個作業job,見下圖,在簡單表同步這個轉換中,我們把在A步驟中建立的ktl配置上,注意路徑的正確性;
這樣我們在【Start】步驟上面雙擊,如圖:
這樣這個作業就制定好了,點擊保存之後,我們就可以在圖形化界面上點擊開始執行了!
2、2 實例2:全面進階的一個稍微複雜的例子
操作步驟:
在EtltestTrans頁面下,點擊左側的【Core Objects】,點擊【Input】,選中【表
輸入】,拖動到主窗口釋放鼠標。
雙擊【表輸入】圖標
數據庫連接選擇剛剛創建好的etltest數據庫連接,在主窗口寫入對應的查詢
語句
Select * from trade ,如下圖:
點擊確定完成。
點擊左側的【Lookup】,選中【數據庫查詢】,拖動到主窗口釋放鼠標。
按住shift鍵,用鼠標點中剛纔創建的【表輸入】,拖動到【數據庫查詢】上,
則建立了兩個環節之間的連接,如圖:
雙擊【數據庫查詢】
步驟名稱寫入account 表查詢,數據庫連接選擇剛剛創建好的etltest 數據庫
連接,查詢的表寫入account,查詢所需的關鍵字中,表字段寫入acctno,比較
操作符寫入“=”,字段1寫入acctno。
在查詢表返回的值裏面寫入custno,確定完成,如下圖:
同上,再創建一個數據庫查詢,命名爲cust表查詢,查詢的表寫入cust,查
詢所需的關鍵字寫入custno=custno,查詢表返回的值寫入custname,custid,
custtype,如下圖:
點擊左側的【Transform】,選中【過濾記錄】,拖動到主窗口釋放鼠標。
點擊左側的【Scripting】,選中兩個【Modified Java Script Value】,拖動到主窗
口釋放鼠標。分別雙擊打開,重命名爲“對公類型修改”和“對私類型修改”。
同時,分別創建【過濾記錄】和【對公類型修改】,【對私類型修改】的連接。
雙擊【規律記錄】打開。
第一個<field>裏面選擇custtype,點擊<value>,在Enter value 裏面寫入1,
確定,如圖:
在發送true數據給步驟裏,選擇【對私類型修改】,在發送false數據給步驟
裏,選擇【對公類型修改】,確定保存,如圖:
雙擊【對公類型修改】,在裏面寫入javascript 腳本語句
var custtype_cn='對公客戶交易'
在字段中寫入custtype_cn,類型選爲string。確定。
同理,在【對私類型修改】中,在裏面寫入javascript腳本語句
var custtype_cn='對私客戶交易'
在字段中寫入custtype_cn,類型選爲string。確定。
點擊左側的【Transform】,選中兩個【增加常量】,拖動到主窗口釋放鼠標。
分別雙擊打開,重命名爲“增加對公常量”和“增加對私常量”。
分別建立【對公類型修改】和【對私類型修改】與【增加對公常量】和【增
加對私常量】的連接,如圖:
雙擊【增加對公常量】,名稱寫入value,類型選擇string,值寫入“這是一
筆對公客戶發生的交易”,確定保存。
同理,雙擊【增加對私常量】,名稱寫入value,類型選擇string,值寫入“這
是一筆對私客戶發生的交易”,確定保存。
點擊左側的【Output】,選中【文本文件輸出】,拖動到主窗口釋放鼠標。
建立【增加對公常量】,【增加對私常量】和【文本文件輸出】的連接,如圖:
雙擊打開【文本文件輸出】,文件名稱寫入D:\etltest\etltest.txt
點擊內容標籤,根據情況進行修改,例如
點擊字段標籤
名稱依次寫入tradeid,acctno,amt,custno,custname,custid,custtype_cn,
value,類型根據各個字段實際類型進行選擇
確定保存
點擊保存創建好的transformation。
點擊運行這個轉換。
點擊launch,開始運行
當所有狀態都變已完成時,則轉換完成,如圖:
本文主要閱讀目錄如下:
4、Windows任務設置
前面兩篇文章中主要講述了Kettle的 Spoon的轉換和作業的GUI設計方式以及運行,也給出了Demo實戰,那麼實際上我們的應用模式可能會要求在服務器上以後臺進程的方式運行這個ETL任務,就像我們傳統上一般都是用Windows服務的方式來處理數據一樣,那麼用Kettle我們怎麼去實現呢?這就需要我們瞭解一下Kettle的Kitchen和Span。
Kitchen——工作(job)執行器 (命令行方式)
Span——轉換(trasform)執行器 (命令行方式)
這裏我們重點講一下 Kitchen.bat作業執行器 ,這個是經常要用到的。
它是一個作業執行引擎,用來執行作業。這是一個命令行執行工具,它的參數說明如下:
-rep : Repository name 任務包所在存儲名
-user : Repository username 執行人
-pass : Repository password 執行人密碼
-job : The name of the job to launch 任務包名稱
-dir : The directory (don''t forget the leading / or \)
-file : The filename (Job XML) to launch
-level : The logging level (Basic, Detailed, Debug, Rowlevel, Error, Nothing) 指定日誌級別
-log : The logging file to write to 指定日誌文件
-listdir : List the directories in the repository 列出指定存儲中的目錄結構。
-listjobs : List the jobs in the specified directory 列出指定目錄下的所有任務
-listrep : List the defined repositories 列出所有的存儲
-norep : Don''t log into the repository 不寫日誌
還是拿我在前面文章中提到的第一個例子來去講一下具體的配置方式,主要的思路就行首先定位到kettle中Kitchen.bat的根目錄,然後執行kitchen命令;
步驟1:首先我們建立一個bat文件,然後點擊編輯進入之後,如下所示,這是定位到Kitchen.bat的目錄;
E:
cd E:\ETL\pdi-open-3.1.0-826
步驟2:執行kitchen命令,如下:
kitchen /file:E:\ETL\腳本文件\MyTest.kjb /level:Basic>>D:\MyTest.log
這裏注意配正確路徑,然後後面是一個基本的日誌模式,後面也需要配置日誌的輸出路徑;
前面我們已經把bat文件建立起來了,這時候我們可以以bat方式運行我們的ETL任務了,不過它的問題是服務器桌面上永遠有個黑CMD屏幕,而且不能關,怎麼讓Bat在屏幕上消失而後臺還能運行呢?具體方法有很多種這裏介紹兩種:
方法一
bat裏有隱藏窗口的命令,很簡單,只需要在代碼頭部加一段代碼就可以了。
@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit
:begin
::下面是你自己的代碼。
方法二
在你批處理的相同目錄下新建一個記事本,裏面輸入:
DIM objShell set objShell=wscript.createObject("wscript.shell")
iReturn=objShell.Run("cmd.exe /C c:\1.bat", 0, TRUE)
(其中win.bat爲你自己的批處理名字,自己改)
然後把這個記事本保存爲後綴名爲.vbe的文件,到時候你只要運行這個vbe文件就達到目的了!
可以寫的簡單點:
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c c:\1.bat",0
或者
CreateObject("WScript.Shell").Run "cmd /c c:\1.bat",0
(這種寫法很多殺軟報毒, 需要替換參數0)
最後那個0是指窗口參數,用法爲:
0 隱藏窗口並激活另一窗口。
1 激活並顯示一個窗口。若窗口是最小化或最大化,則恢復到其原來的大小和位置。
2 激活窗口並以最小化顯示該窗口。
3 激活窗口並以最大化顯示該窗口。
4 按窗口最近的大小和位置顯示。活動窗口保持活動。
5 以當前大小和位置激活並顯示窗口。
6 最小化指定窗口並激活按 Z 序排序的下一個頂層窗口。
7 最小化顯示窗口。活動窗口保持活動。
8 以當前狀態顯示窗口。活動窗口保持活動。
9 激活並顯示窗口。若窗口是最小化或最大化,則恢復到原來的大小和位置。在還原應用程序的最小化窗口時,應指定該標誌。
4、Windows任務設置
經過前面的兩步,我們已經可以讓ETL作業在服務器上無聲無息的運行了,但是如何自由調度呢,我們再結合windows的任務計劃即可,這裏不再贅述!