- 簡介
- 工作流程
- 核心架構
- 核心模組介紹
- DataX排程流程
- 支援的資料
- 實踐
- 下載
- 環境
- 執行流程
- 引用
簡介
DataX是一個資料同步工具,可以將資料從一個地方讀取出來並以極快的速度寫入另外一個地方。常見的如將mysql中的資料同步到另外一個mysql中,或者另外一個mongodb中。
工作流程
- read:設定一個源,DataX從源讀取資料
- write:設定一個目的地,DataX將讀取到的資料寫入目的地
- setting:同步設定,如設定併發通道、控制作業速度等
- Framework:Framework用於連線reader和writer,作為兩者的資料傳輸通道,並處理緩衝,流控,併發,資料轉換等核心技術問題
- 多執行緒:充分利用多執行緒來處理同步任務
核心架構
核心模組介紹
1:DataX完成單個資料同步的作業,我們稱之為Job,DataX接受到一個Job之後,將啟動一個程序來完成整個作業同步過程。DataX Job模組是單個作業的中樞管理節點,承擔了資料清理、子任務切分(將單一作業計算轉化為多個子Task)、TaskGroup管理等功能。
2:DataXJob啟動後,會根據不同的源端切分策略,將Job切分成多個小的Task(子任務),以便於併發執行。Task便是DataX作業的最小單元,每一個Task都會負責一部分資料的同步工作。
3:切分多個Task之後,DataX Job會呼叫Scheduler模組,根據配置的併發資料量,將拆分成的Task重新組合,組裝成TaskGroup(任務組)。每一個TaskGroup負責以一定的併發執行完畢分配好的所有Task,預設單個任務組的併發數量為5
4:每一個Task都由TaskGroup負責啟動,Task啟動後,會固定啟動Reader—>Channel—>Writer的執行緒來完成任務同步工作
5:DataX作業執行起來之後, Job監控並等待多個TaskGroup模組任務完成,等待所有TaskGroup任務完成後Job成功退出。否則,異常退出,程序退出值非0
DataX排程流程
舉例來說,使用者提交了一個DataX作業,並且配置了20個併發,目的是將一個100張分表的mysql資料同步到odps裡面。 DataX的排程決策思路是:
-
DaXJob根據分庫分表切分成了100個Task。
-
根據20個併發,DataX計算共需要分配4個TaskGroup。
-
4個TaskGroup平分切分好的100個Task,每一個TaskGroup負責以5個併發共計執行25個Task。
支援的資料
型別 | 資料來源 | Reader(讀) | Writer(寫) | 文件 |
---|---|---|---|---|
RDBMS 關係型資料庫 | MySQL | √ | √ | 讀 、寫 |
Oracle | √ | √ | 讀 、寫 | |
OceanBase | √ | √ | 讀 、寫 | |
SQLServer | √ | √ | 讀 、寫 | |
PostgreSQL | √ | √ | 讀 、寫 | |
DRDS | √ | √ | 讀 、寫 | |
達夢 | √ | √ | 讀 、寫 | |
通用RDBMS(支援所有關係型資料庫) | √ | √ | 讀 、寫 | |
阿里雲數倉資料儲存 | ODPS | √ | √ | 讀 、寫 |
ADS | √ | 寫 | ||
OSS | √ | √ | 讀 、寫 | |
OCS | √ | √ | 讀 、寫 | |
NoSQL資料儲存 | OTS | √ | √ | 讀 、寫 |
Hbase0.94 | √ | √ | 讀 、寫 | |
Hbase1.1 | √ | √ | 讀 、寫 | |
MongoDB | √ | √ | 讀 、寫 | |
Hive | √ | √ | 讀 、寫 | |
無結構化資料儲存 | TxtFile | √ | √ | 讀 、寫 |
FTP | √ | √ | 讀 、寫 | |
HDFS | √ | √ | 讀 、寫 | |
Elasticsearch | √ | 寫 |
實踐
作為極簡教程,本文將從mysql中讀取一張表的資料,然後同步到clickhouse中。
下載
開啟該專案的Github 首頁進行下載:https://github.com/alibaba/DataX
下載連結:https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz
下載下來是一個tar.gz的包,windows下解壓命令:
tar -zxvf xxx.tar.gz
程式目錄:
- bin:使用裡面的 datax.py 來啟動程式
- job:裡面放了一個job.json,用來檢查執行環境,一般的建議下載完畢之後執行一次。
- log:存放執行日誌
- plugin:外掛集,外掛分為read和write,分別對應datax可支援的資料庫
- 其他目錄:......
環境
DataX是基於python和java的,需要機器擁有python和java 的執行環境。
在下載完畢後,透過執行自檢指令碼,可確認環境是否正確
python {YOUR_DATAX_HOME}/bin/datax.py {YOUR_DATAX_HOME}/job/job.json
執行流程
編寫同步任務配置檔案,在job目錄中建立 mysql-to-clickhouse.json 檔案,並填入如下內容
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "xxx",
"password": "xxx",
"column": [
"id",
"name"
],
"splitPk": "id",
"connection": [
{
"table": [
"table_name"
],
"jdbcUrl": [
"jdbc:mysql://192.168.1.xxx:xxx/db_name"
]
}
]
}
},
"writer": {
"name": "clickhousewriter",
"parameter": {
"username": "xxx",
"password": "xxx",
"column": [
"id",
"ame"
],
"connection": [
{
"jdbcUrl": "jdbc:clickhouse://192.168.1.xxx:xxx/table_name",
"table": [
"table_name"
]
}
],
"preSql": [],
"postSql": [],
"batchSize": 65536,
"batchByteSize": 134217728,
"dryRun": false,
"writeMode": "insert"
}
}
}
]
}
}
- job:一個job包含兩個部分,setting中設定任務的執行速度,錯誤限制等,content中是任務具體的描述。
- reader:任務的資料輸入源
- writer:任務的資料輸出源
根據任務配置檔案啟動datax,先cd到datax的根目錄
python bin/datax.py job/mysql-to-clickhouse.json
執行上述命令後,任務就開啟了。本例從mysql資料庫中的一張表中讀取了兩個欄位(id,name),然後同步到clickhouse中,clickhouse中需要先建立同樣的庫,表和列。
任務執行非常快,140W資料僅用了 18s 就完成了同步。
2024-05-16 16:24:57.312 [job-0] INFO JobContainer -
任務啟動時刻 : 2024-05-16 16:24:38
任務結束時刻 : 2024-05-16 16:24:57
任務總計耗時 : 18s
任務平均流量 : 2.21MB/s
記錄寫入速度 : 142425rec/s
讀出記錄總數 : 1424252
讀寫失敗總數 : 0
引用
- readme:https://github.com/alibaba/DataX
- introduction:https://github.com/alibaba/DataX/blob/master/introduction.md