使用Kettle進行數據同步(增量)

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怎麼創建

  1. 連接創建
    在這裏插入圖片描述
  2. 查詢編寫
    在這裏插入圖片描述
  3. 字段映射
    下圖中的複選框標識是否將結果以一個字段返回,如果是的話,結果將會是一個名爲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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章