DataX簡介
DataX是什麼?它是幹什麼用的?下面是官方給的介紹。
DataX 是阿里巴巴集團內被廣泛使用的離線數據同步工具/平臺,實現包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各種異構數據源之間高效的數據同步功能。
DataX本身作爲數據同步框架,將不同數據源的同步抽象爲從源頭數據源讀取數據的Reader插件,以及向目標端寫入數據的Writer插件,理論上DataX框架可以支持任意數據源類型的數據同步工作。同時DataX插件體系作爲一套生態系統, 每接入一套新數據源該新加入的數據源即可實現和現有的數據源互通。
設計理念
傳統的異構數據庫之間的同步使用的是一對一的同步策略,實現起來極其複雜,如下圖左邊的同步模型。DataX的出現打破了這種觀念,使用中心化的方式,將複雜的網狀的同步鏈路變成了星型數據鏈路,如下圖右邊的同步模型。DataX作爲中間傳輸載體負責連接各種數據源。當需要接入一個新的數據源的時候,只需要將此數據源對接到DataX,便能跟已有的數據源做到無縫數據同步,加大了代碼的複用性。
DataX本身採用Framework + plugin的架構,將數據源讀取和寫入抽象成爲Reader/Writer插件。
- Framework:Framework用於連接Reader和Writer,作爲兩者的數據傳輸通道,並處理緩衝,流控,併發,數據轉換等核心技術問題。
- Reader:DataX採集模塊,負責將數據源的數據輸入到DataX的Framework。
- Writer:負責從DataX的Framework中拉取數據,寫入到對應的目的地。
DataX提供了豐富的插件,足夠覆蓋大多數場景,此外DataX還支持自定義插件,以滿足個性化需求。DataX自定義插件開發指南
DataX核心架構
DataX 3.0 開源版本支持單機多線程模式完成同步作業運行(從源碼上看是支持集羣運行的)。
- DataX完成單個數據同步的作業,我們稱之爲Job,DataX接受到一個Job之後,將啓動一個進程來完成整個作業同步過程。DataX Job模塊是單個作業的中樞管理節點,承擔了數據清理、子任務切分(將單一作業計算轉化爲多個子Task)、TaskGroup管理等功能。
- DataXJob啓動後,會根據不同的源端切分策略,將Job切分成多個小的Task(子任務),以便於併發執行。Task便是DataX作業的最小單元,每一個Task都會負責一部分數據的同步工作。
- 切分多個Task之後,DataX Job會調用Scheduler模塊,根據配置的併發數據量,將拆分成的Task重新組合,組裝成TaskGroup(任務組)。每一個TaskGroup負責以一定的併發運行完畢分配好的所有Task,默認單個任務組的併發數量爲5。
- 每一個Task都由TaskGroup負責啓動,Task啓動後,會固定啓動Reader—>Channel—>Writer的線程來完成任務同步工作**(從源碼裏面看其實是先啓動Writer,再啓動Reader)**。
- DataX作業運行起來之後, Job監控並等待多個TaskGroup模塊任務完成,等待所有TaskGroup任務完成後Job成功退出。否則,異常退出,進程退出值非0。(通過該退出值可以判斷程序是否異常,可以做一些相應的操作,如:郵件告警)
安裝部署
準備工作
- 下載:http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz
- 在本地或者服務器上解壓
- 需要python 2.6+環境(DataX的啓動腳本是python文件,也可以自己將裏面執行jar包的命令拿出來)
測試
python bin/datax.py job/job.json
出現下圖內容說明DataX功能測試完成
開始開發
下面以比較簡單的mysql -> mysql爲例講解.
- 官方提供的文檔默認是使用table模式的。該模式配置起來比較麻煩,下面例子採用querySql模式,使用起來簡單易懂。
- writeMode:包含insert, replace, update,其中update採用的是INSERT… ON DUPLICATE KEY UPDATE 的方式,意思是當insert已經存在的記錄時,執行update
- 在writer階段可以執行preSql,表示在插入數據之前需要執行的操作
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"connection": [
{
"querySql": ["SELECT * FROM table1"],
"jdbcUrl": ["jdbc:mysql://localhost:3306/datax?useSSL=false&useUnicode=true&characterEncoding=UTF-8"]
}
],
"password": "root",
"username": "root"
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"column": ["*"],
"writeMode": "update",
"preSql": [
"delete from table2"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://localhost:3306/datax?useSSL=false&useUnicode=true&characterEncoding=UTF-8",
"table": ["table2"]
}
],
"password": "root",
"username": "root"
}
}
}
],
"setting": {
"speed": {
"byte": 1048576,
"channel": 5
}
}
}
}
驗證
執行DataX啓動腳本以驗證結果:bin/datax.py job/test.josn