1. 程式人生 > >資料遷移工具Kettle

資料遷移工具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 &