文章目錄
kettle介紹
Kettle 是一款國外開源的 ETL 工具,純 Java 編寫,綠色無需安裝,數據抽取高效穩定(數據遷移工具)。Kettle
中有兩種腳本文件,transformation 和 job,transformation 完成針對數據的基礎轉換,job
則完成整個工作流的控制。 Kettle 中文名稱叫水壺,該項目的主程序員MATT 希望把各種數據放到一個壺裏,然後以一種指定的格式流出。
Kettle這個ETL工具集,它允許你管理來自不同數據庫的數據,通過提供一個圖形化的用戶環境來描述你想做什麼,而不是你想怎麼做。
Kettle家族目前包括4個產品:Spoon、Pan、CHEF、Kitchen。
SPOON 允許你通過圖形界面來設計ETL轉換過程(Transformation)。
PAN 允許你批量運行由Spoon設計的ETL轉換 (例如使用一個時間調度器)。Pan是一個後臺執行的程序,沒有圖形界面。
CHEF 允許你創建任務(Job)。 任務通過允許每個轉換,任務,腳本等等,更有利於自動化更新數據倉庫的複雜工作。任務通過允許每個轉換,任務,腳本等等。任務將會被檢查,看看是否正確地運行了。KITCHEN 允許你批量使用由Chef設計的任務 (例如使用一個時間調度器)。KITCHEN也是一個後臺運行的程序。
kettle安裝
進入下面鏈接下載:
wget https://nchc.dl.sourceforge.net/project/pentaho/Pentaho%209.0/client-tools/pdi-ce-9.0.0.0-423.zip
大小約爲1.5個G,需要搭梯子加速
下載完成之後直接解壓就可以使用,不用安裝
kettle使用
由於kettle是純java編寫,沒有web界面,自帶了spoon爲gui界面,Linux環境下需要安裝桌面才能使用圖形化界面,建議在Windows下面使用spoon,然後把生成的文件放到服務器上面執行
使用kettle同步關係型數據庫數據(MySQL示例)
安裝好了kettle之後再Windows下我們執行spoon.bat ,然後等待一段時間,會出現如下界面
1. 創建一個轉換
在歡迎界面選擇菜單欄 文件—>新建—> 轉換
2. 選擇表輸入
在這之前你也許應該要先下載一個MySQL的數據庫連接驅動,然後放到安裝目錄的 lib目錄下面,其他數據庫同理。
接下來在左邊的核心對象裏面選擇表輸入,拖到右側面板,如圖:
雙擊表輸入彈出如下界面。
在下面的界面裏面首先需要新建一個數據庫連接,創建完成之後再編寫SQL語句。
在下圖中藍色方框裏面是一個記錄表,記錄了當前同步的記錄的ID
3. 格式轉換
再上一個步驟裏面創建好了轉換之後我們需要把查詢結果轉換爲JSON格式(可選)。
同理,我們再左側輸出裏面選中一個JSON output 然後放到右邊面板
接着雙擊剛剛創建的JSON輸出,操作選擇 output value,把結果輸出到下一個步驟,同時,JSON的字段名爲data,其輸出格式如圖所示
4. 執行腳本
kettle爲我們提供了多種腳本的支持,這裏我們使用java腳本,把剛剛查詢的數據發送到mq。
-
創建腳本
在左側的核心對象選擇腳本—>java腳本,拖放到右側面板
-
選擇代碼模板
雙擊我們剛剛創建的腳本,在彈出的選擇框裏面我們可以快速生成一個代碼模板,如圖:
-
編寫代碼
在選擇了代碼模板之後,我們開始編寫腳本代碼,不過在這之前需要先把腳本運行所需要的依賴放到安裝目錄下面的lib目錄下,例如我的腳本就需要kafka的客戶端驅動。
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
private static final KafkaProducer<String, String> producer;
//需要到日誌管理平臺申請一個主題和分區
private static final String TOPIC="testLogTopic";
//需要到日誌管理平臺申請一個主題和分區
private static final int PARTITION=1;
private static final String SERVER_PATH="172.16.161.51:9002,172.16.161.51:9003,172.16.161.51:9004";
static{
/**
* 一般這裏的屬性不用更改
*/
Properties props = new Properties();
props.put("bootstrap.servers", SERVER_PATH);//xxx服務器ip
props.put("acks", "all");//所有follower都響應了才認爲消息提交成功,即"committed"
props.put("retries", 0);//retries = MAX 無限重試,直到你意識到出現了問題:)
props.put("batch.size", 16384);//producer將試圖批處理消息記錄,以減少請求次數.默認的批量處理消息字節數
//batch.size當批量的數據大小達到設定值後,就會立即發送,不顧下面的linger.ms
props.put("linger.ms", 1);//延遲1ms發送,這項設置將通過增加小的延遲來完成--即,不是立即發送一條記錄,producer將會等待給定的延遲時間以允許其他消息記錄發送,這些消息記錄可以批量處理
props.put("buffer.memory", 33554432);//producer可以用來緩存數據的內存大小。
props.put("key.serializer",
"org.apache.kafka.common.serialization.IntegerSerializer");
props.put("value.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
producer = new KafkaProducer<String, String>(props);
}
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
Object[] r = getRow();
if (r == null) {
setOutputDone();
return false;
}
// It is always safest to call createOutputRow() to ensure that your output row's Object[] is large
// enough to handle any new fields you are creating in this step.
r = createOutputRow(r, data.outputRowMeta.size());
String res = get(Fields.In, "data").getString(r);
try{
//String val = new String(res.getBytes(),"utf-8");
//發送消息
producer.send(new ProducerRecord<String, String>(TOPIC,PARTITION,null, res));
//logBasic(val);
}catch(Exception e){
logError(e.getMessage(), e);
}
// Send the row on to the next step.
putRow(data.outputRowMeta, r);
return true;
}
5. 創建job
在轉換創建完成之後需要創建一個job用來運行我們創建的轉換
菜單欄—>文件—>新建—>作業
如圖,創建好job之後再左側的核心對象裏面選擇start,轉換,成功等組件拖放到右側面板
在這個job中:
start
start標記着本次任務的開始,雙擊start可以設置該job的執行方案,比如重複執行等等
轉換
雙擊轉換可以選擇我們在之前創建的轉換文件
腳本
轉換步驟完成之後我們需要更新一下下一次開始同步的時候需要的ID的值,所以我們可以添加一個腳本來執行更新操作
使用kettle同步NoSql數據(MongoDB示例)
這裏創建作業和轉換的步驟和前面大同小異,就不詳細介紹了,主要說明幾點區別
創建轉換時的注意事項
由於kettle裏面轉換時併發執行的,在編寫轉換的時候需要注意有些步驟坑需要阻塞,如圖:
在下面的轉換裏面第一步查詢到了一個開始ID之後然後把結果設置到一個變量裏面,然後在MongoDBinput裏面就可以使用剛剛設置的變量,但是在這三個步驟裏面由於是並行執行的,所以如果不添加阻塞步驟,可能會導致MongoDBinput這個步驟獲取不到最新的變量
MongoDBInput怎麼創建
- 連接創建
- 查詢編寫
- 字段映射
下圖中的複選框標識是否將結果以一個字段返回,如果是的話,結果將會是一個名爲data的JSON字符串
job的創建
在job裏面有兩個轉換,一個是同步數據的轉換,另一個是更新同步位置的轉換,如下圖所示,這個步驟是爲了在一次任務同步完成之後更新下一次任務開始時的ID
如何在Linux上面運行已經創建好的job?
在這之前需要把我們用到的依賴jar包先放到Linux機器上面的kettle安裝目錄下面的lib目錄裏面去,比如MySQL的驅動等等。
1、把創建好的job傳輸到Linux機器上面
2、編輯kjb文件
編輯我們創建好的kjb文件,由於job文件中的轉換路徑發生了變化,所以需要修改爲正確的路徑
如圖,搜索filename關鍵字可以找到對應的需要修改的位置,把路徑修改爲目前Linux裏面的路徑就可以了。
3、執行任務
執行下面的代碼就可以運行我們創建好的job了
../data-integration/kitchen.sh -file=mongoSync.kjb