資料遷移工具Kettle
1. 背景知識
(1) 什麼是ETL
ETL是Extract-Transform-Load 的縮寫,用來描述將資料從來源端經過抽取(extract)、互動轉換(transform)、載入(load)至目的端的過程。
(2) Kettle簡介
Kettle是一款國外開源的ETL工具,純java編寫,可以在Window、Linux、Unix上執行,資料抽取高效穩定。Kettle 中文名稱叫水壺,該專案的主程式設計師MATT 希望把各種資料放到一個壺裡,然後以一種指定的格式流出。我們常用它定時將一些庫的資料稍做轉換後存入其它庫。
(3) 工作機制
Kettle中有兩種指令碼檔案,transformation和job,transformation完成針對資料的基礎轉換,job則完成整個工作流的控制。
2. 安裝和執行
(1) 安裝
另外,還需要安裝對應資料庫的支援,比如我使用mysql資料庫,則需要下載mysql-connector-java-5.1.41-bin.jar放到/usr/local/kettle/data-integration/lib目錄下。
(2) 啟動圖形介面
kettle提供圖形介面和命令列兩種方式,圖形介面主要用於配置和測試,命令列主要用於執行。
$ cd /usr/local/kettle/data-integration/
$ ./spoon.sh
3. 準備工作
一般使用kettle主要是導資料,因此以資料庫作為例項,選建立資料庫環境。如果只使用最簡單的排程,也可以不使用資料庫;如果已安裝資料庫,請忽略安裝資料庫,要建表即可。
(1) 安裝mysql資料庫
$ sudo apt-get install mysql-server
$ sudo apt isntall mysql-client
$ sudo apt install libmysqlclient-dev
(2) 建庫建表
$ mysql -uroot -p > create database test_db; > use test_db; > create table table1 (id INT, name VARCHAR(20), date DATE); > create table table2 (id INT, name VARCHAR(20), date DATE); > insert into table1 values(1,'xy','2018-11-04'); > insert into table1 values(2,'llx','2018-11-05'); $ select * from table1;
此時建立了庫test_db, 庫中有表table1, table2, 表中各有三個欄位id, name, date,table1中插入了兩條記錄,接下來的操作是將table1中的資料匯入table2。
4. 一個簡單的作業排程
(1) 建立一個變換Transformation
i. 新建一個變換
在Kettle介面上:選單->New->Transformation
ii. 加一個輸入庫
主介面:左側->Input->Table Input,拉到工作區建立新的table input。 雙擊table input,調出其編輯介面。 在編輯介面點Connection->New,建立一個數據庫連線。 在連線介面,Connection Type選MySQL,設定Host Name: 127.0.0.1, Database Name: test_db, Port Number: 3306, User Name: root, Password:你的密碼,Connection Name:test1,此時點Test,可檢視資料庫是否連線成功,如果成功,點OK建立連線。 在Table Input編輯介面,選Get SQL select statement…,從庫中選擇你所要輸入的表table1,此時自動生成了select查詢語句(這就是kettle方便的地方,不用手敲,自動生成語句,簡單編輯即可),選OK確定。
iii. 加一個輸出庫
主介面:左側->Output->Table Output,拉到工作區建立新的table output。 雙擊table output,調出其編輯介面。 在編輯介面,Conection中選擇剛才建立的資料庫連線test1,Target table選中table2,點OK確定。
iv. 連線輸入和輸出,並測試
按住shift鍵,從Table input拖一條線到Table output,用選單File->Save儲存該變換名為test_trans,然後點上方的Run鍵執行,正常情況下,小圖示右上角出現綠色對勾,說明執行正常。 在mysql中輸入
> select * from table2;
可以看到資料庫table1中的資料已經被複制到table2中,此時一個Transformation就完成了。
(2) 建立一個工作流Job
i. 新建一個Job
在Kettle介面上:選單->New->Job
ii. 加入模組
主介面:左側->General->START,拖出一個START(可以設定執行時間) 主介面:左側->General->Transformation,拖出一個,雙擊調出編輯介面,Browse選剛才儲存的test_trans檔案,點OK確認。 主介面:左側->General->Success,拖出一個Success
iii. 連線模型,並測試
按住Shift依次連線:Start->Transformation->Success,然後點上方的執行按鈕,正常情況下就能正常運行了。
(3) 變數和選擇分支
i. 新建一個變換
在Kettle介面上:選單->New->Transformation。
ii. 建立變數
主介面:左側->Job->Set Variables,拖到主工作區,雙擊編輯,新建一個變數flag,Default value為1。
iii. 建立選擇分支
主介面:左側->Flow->Switch/Case,拖到主工作區,雙擊編輯,在Field name to switch指定變數flag,然後在Case values中加兩個值0和1。 主介面:左側->Flow->Dummy,拖到主工作區 主介面:左側->Flow->Abort,拖到主工作區
iv. 連線模型,並測試
按住Shift依次連線:Set Variables->Switch/Case,Switch/Case連Abort時選This case target value 0,Switch/Case連Dummy時選This case target value 0。
然後點上方的執行按鈕,正常情況下就能正常運行了。 這裡設定的變數也可以在整個工作流中使用,操作資料庫時使用方法是${變數名},注意需要選中“use variables in script”。
(4) 其它
除了以上的導庫,設變數,分支,以外,常用的還有Java程式模型(左側Transformation->Steps->User defined Java Class),通常用於在資料庫轉換過程中做一些sql無法實現的資料變換,同樣的,新建時,它也會生成一段基礎程式碼,簡單修改即可。
5. 用命令列執行任務
上面建立的Transformation副檔名為ktr,Job副檔名為kjb,可通過kitchen.sh執行,具體命令是:
./kitchen.sh -file=xxx.kjb
如需不受控制檯關閉的影響,可以使用以下命令,使kettle一直在後臺執行:
nohup ./kitchen.sh -file=xxx.kjb &