使用Kettle定時從資料庫A重新整理資料到資料庫B

2023-06-29 18:01:18

一、需求背景

由於專案場景原因,需要將A庫(MySQL)中的表a、表b、表c中的資料定時T+1 增量的同步到B庫(MySQL)。這裡說明一下,不是資料庫的主從備份,就是普通的資料同步。經過技術調研,發現Kettle挺合適的,原因如下:

  1. Kettle (資料抽取、清洗、轉換、裝載)是由java 編寫,可以在 Window、Linux、Unix 上執行。支援多資料來源, 多種中介軟體的專業ETL 工具;
  2. 視覺化介面支援圖形化GUI設計介面,元件多樣性,支援元件拖拉拽,不用寫額外的程式碼;
  3. Kettle的流程圖本質上都是組態檔,如.ktr/.kjb檔案。這種設計的好處就是,當我們把轉換流程圖畫完之後,可以直接複製到另外一個環境中執行,如:在Windows電腦上畫好流程圖,複製到Liunx系統上執行
  4. 免費、元件多、支援開源,一般處理T+1的資料同步是沒有問題的。如果並行高、實時性高、資料量大就建議使用Flink了。

二、使用方式

1. 安裝包下載

官網地址:https://sourceforge.net/projects/pentaho/files/Data%20Integration/

2. 啟動方式

Windows點選Spoon.bat啟動

出現以下圖片表示正在啟動,如果一直沒有反應,使用管理員身份執行

主介面如下:

三、連線MySQL資料庫

1. 準備MySQL連線驅動jar包

由於Kettle自身是不帶任何資料庫驅動包的,所以這裡我們需要先自己準備好驅動包,版本最好選擇5.1.49。下載好jar包後,拷貝到lib目錄下(Windows和Linux同理)。如果已經啟動了Kettle,則需要關掉重新啟動,否則驅動包不會被載入。

2. 建立資料來源

依次點選:轉換——>主物件樹——>DB連線——>點選新建——>測試

同上操作,建立好兩個資料來源:源資料庫、目標庫;目標就是將源資料庫中的表資料同步到目標庫中去

3. 設定轉換流程

① 加入輸入節點:轉換——>輸入——>表輸入

② 雙擊輸入節點開啟設定頁,輸入一下資訊

這裡因為我是定時T+1 增量同步資料,所以我加了個同步條件WHERE gmt_create >= CURDATE()表示該資料建立時間大於當天才會進行查詢。

點選預覽,正好有一條資料

③加入轉換節點:轉換——>插入/更新——>按住shift建立連線

④ 雙擊插入/更新節點,開啟設定頁

⑤ 點選執行測試

四、複製ktr檔案到Liunx上定時執行

在Linux上,ktr檔案使用Kettle的pan.sh指令碼執行,命令大致如下:sh /home/admin/kettle/data-integration/pan.sh -file=/home/admin/kettle/ktr/table_transfer.ktr -norep。同時為了實現定時執行這個指令碼,我打算用Linux自帶的corntab功能設定定時。

首先我編寫了一個shell指令碼,命名為cornSql.sh,用於儲存ktr的執行命令,內容如下:

#!/bin/bash 
export KETTLE_HOME=/home/admin/kettle/data-integration
export JAVA_HOME=/usr/java/jdk1.8.0_131
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin:${KETTLE_HOME}
export JRE_HOME=${JAVA_HOME}/jre

TIME=$(date "+%Y%m%d")
sh /home/admin/kettle/data-integration/pan.sh -file=/home/admin/kettle/ktr/table_transfer.ktr -norep >>/home/admin/kettle/log/transfer-"$TIME".log

其次,將ktr指令碼拷貝到指定目錄下,也就是/home/admin/kettle/ktr目錄下,輸入 crontab -e,再輸入0 1 * * * /home/admin/kettle/cornSql.sh,這句話的意思是每天凌晨1點定時執行cornSql.sh指令碼
為了檢查定時設定是否生效,這裡可以使用 crontab -l -u root命令,如果剛才的定時指令有列印出來,則證明設定生效。

最後,第二天檢查一下執行紀錄檔檔案有沒有生成,在/home/admin/kettle/log目錄下,這裡我把每天執行的日期列印出來了,如下圖: