DATAX概覽
DataX 是一個異構資料來源離線同步工具,致力於實現包括關係型資料庫(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各種異構資料來源之間穩定高效的資料同步功能。
-
設計理念
為了解決異構資料來源同步問題,DataX將複雜的網狀的同步鏈路變成了星型資料鏈路,DataX作為中間傳輸載體負責連線各種資料來源。當需要接入一個新的資料來源的時候,只需要將此資料來源對接到DataX,便能跟已有的資料來源做到無縫資料同步。
-
當前使用現狀
DataX在阿里巴巴集團內被廣泛使用,承擔了所有大資料的離線同步業務,並已持續穩定執行了6年之久。目前每天完成同步8w多道作業,每日傳輸資料量超過300TB。
DataX框架設計
DataX本身作為離線資料同步框架,採用Framework + plugin架構構建。將資料來源讀取和寫入抽象成為Reader/Writer外掛,納入到整個同步框架中。
- Reader:Reader為資料採集模組,負責採集資料來源的資料,將資料傳送給Framework。
- Writer: Writer為資料寫入模組,負責不斷向Framework取資料,並將資料寫入到目的端。
- Framework:Framework用於連線reader和writer,作為兩者的資料傳輸通道,並處理緩衝,流控,併發,資料轉換等核心技術問題。
DataX外掛體系
經過幾年積累,DataX目前已經有了比較全面的外掛體系,主流的RDBMS資料庫、NOSQL、大資料計算系統都已經接入。DataX目前支援資料如下:
型別 | 資料來源 | 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 | √ | 寫 |
DataX Framework提供了簡單的介面與外掛互動,提供簡單的外掛接入機制,只需要任意加上一種外掛,就能無縫對接其他資料來源。
DataX核心架構
核心模組介紹:
- 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的執行緒來完成任務同步工作。
- DataX作業執行起來之後, Job監控並等待多個TaskGroup模組任務完成,等待所有TaskGroup任務完成後Job成功退出。否則,異常退出,程序退出值非0
DataX排程流程:
舉例來說,使用者提交了一個DataX作業,並且配置了25個併發,目的是將一個100張分表的mysql資料同步到odps裡面。 DataX的排程決策思路是:
- DataXJob根據分庫分表切分成了100個Task。
- 根據25個併發,DataX計算共需要分配4個TaskGroup
- 4個TaskGroup平分切分好的100個Task,每一個TaskGroup負責以5個併發共計執行25個Task。
DataX六大核心優勢
-
可靠的資料質量監控
- 完美解決資料傳輸個別型別失真問題
- 提供作業全鏈路的流量、資料量執行時監控
- 提供髒資料探測
-
豐富的資料轉換功能
DataX作為一個服務於大資料的ETL工具,除了提供資料快照搬遷功能之外,還提供了豐富資料轉換的功能,讓資料在傳輸過程中可以輕鬆完成資料脫敏,補全,過濾等資料轉換功能,另外還提供了自動groovy函式,讓使用者自定義轉換函式。
-
精準的速度控制
新版本DataX3.0提供了包括通道(併發)、記錄流、位元組流三種流控模式,可以隨意控制你的作業速度,讓你的作業在庫可以承受的範圍內達到最佳的同步速度。
"speed": { "channel": 5, "byte": 1048576, "record": 10000 }
-
強勁的同步效能
DataX3.0每一種讀外掛都有一種或多種切分策略,都能將作業合理切分成多個Task並行執行,單機多執行緒執行模型可以讓DataX速度隨併發成線性增長。在源端和目的端效能都足夠的情況下,單個作業一定可以打滿網路卡。另外,DataX團隊對所有的已經接入的外掛都做了極致的效能最佳化,並且做了完整的效能測試
-
健壯的容錯機制
DataX作業是極易受外部因素的干擾,網路閃斷、資料來源不穩定等因素很容易讓同步到一半的作業報錯停止。因此穩定性是DataX的基本要求,在DataX 3.0的設計中,重點完善了框架和外掛的穩定性。目前DataX3.0可以做到執行緒級別、程序級別(暫時未開放)、作業級別多層次區域性/全域性的重試,保證使用者的作業穩定執行。
- 執行緒內部重試
- 執行緒級別重試
-
極簡的使用體驗
-
易用
-
詳細
DataX在執行日誌中列印了大量資訊,其中包括傳輸速度,Reader、Writer效能,程序CPU,JVM和GC情況等等。
- 傳輸過程中列印傳輸速度、進度等
- 傳輸過程中會列印程序相關的CPU、JVM等
- 在任務結束之後,列印總體執行情況
-
DataX與Sqoop對比
功能 | DataX | Sqoop |
---|---|---|
執行模式 | 單程序多執行緒 | MR |
分散式 | 不支援,可以透過排程系統規避 | 支援 |
流控 | 有流控功能 | 需要定製 |
統計資訊 | 已有一些統計,上報需定製 | 沒有,分散式的資料收集不方便 |
資料校驗 | 在core部分有校驗功能 | 沒有,分散式的資料收集不方便 |
監控 | 需要定製 | 需要定製 |
DataX使用
模板介紹
生成模板的命令 datax.py -r mysqlreader -w hdfswriter
{ "job": { "content": [ { "reader": { "name": "mysqlreader", "parameter": { "column": [ "列" ], "connection": [ { "jdbcUrl": ["url"], "table": ["tablename"] } ], "password": "", "username": "", "where": "" } }, "writer": { "name": "hdfswriter", "parameter": { "column": [ "列" ], "compress": "是否需要壓縮", "defaultFS": "", "fieldDelimiter": ",", "fileName": "tablename", "fileType": "text/orc", "path": "hdfs", "writeMode": "insert/overwrite" } } } ], "setting": { "speed": { "channel": "1/2/.." } } } }
1、使用說明
-
DataX任務提交命令
DataX的使用十分簡單,使用者只需根據自己同步資料的資料來源和目的地選擇相應的Reader和Writer,並將Reader和Writer的資訊配置在一個json檔案中,然後執行如下命令提交資料同步任務即可。
python ./bin/datax.py ./job/job.json datax.py xxx.json
-
DataX配置檔案格式
編寫json檔案的步驟:
1、根據你確定的reader和writer來使用命令生成對應的模板
2、去github上找到對應引數值的寫法,主要是看引數是否是必須項,有什麼影響
DataX基本使用
-
mysql2mysql(資料遷移)
生成Mysql到Mysql同步的模板:
{ "job": { "content": [ { "reader": { "name": "mysqlreader", "parameter": { "column": ["*"], "connection": [ { "jdbcUrl": ["jdbc:mysql://master:3306/yourdb?useUnicode=true&characterEncoding=utf-8"], "table": [tablename] } ], "password": "******", "username": "******", "where": "where條件" } }, "writer": { "name": "mysqlwriter", "parameter": { "column": [ "col1"... ], "connection": [ { "jdbcUrl": "jdbc:mysql://master:3306/yourdb?useUnicode=true&characterEncoding=utf-8", "table": ["tablename"] } ], "password": "******",, "preSql": [], "session": [], "username": "******",, "writeMode": "insert/overwrite" } } } ], "setting": { "speed": { "channel": "1" } } } }
使用datax之前需要先建表
datax.py mysql2mysql.json
-
mysql2hdfs
檢視模板
datax.py -r mysqlreader -w hdfswriter
{ "job": { "content": [ { "reader": { "name": "mysqlreader", "parameter": { "column": ["*"], "connection": [ { "jdbcUrl": ["jdbc:mysql://master:3306/yourdb?useUnicode=true&characterEncoding=utf-8"], "table": [tablename] } ], "password": "******", "username": "******", "where": "" } }, "writer": { "name": "hdfswriter", "parameter": { "column": [ { "name": "col1", "type": "string" }, { "name": "col2", "type": "string" } ], "compress": "", "defaultFS": "hdfs://master:9000", "fieldDelimiter": ",", "fileName": "tablename", "fileType": "text", "path": "yourpath", "writeMode": "append" } } } ], "setting": { "speed": { "channel": "1" } } } }
執行之前需要先建表
執行同步任務
datax.py mysql2hdfs.json
-
mysql2hive
(1)、目前HdfsWriter僅支援textfile和orcfile兩種格式的檔案,且檔案內容存放的必須是一張邏輯意義上的二維表; (2)、由於HDFS是檔案系統,不存在schema的概念,因此不支援對部分列寫入; (3)、目前僅支援與以下Hive資料型別: 數值型:TINYINT,SMALLINT,INT,BIGINT,FLOAT,DOUBLE 字串型別:STRING,VARCHAR,CHAR 布林型別:BOOLEAN 時間型別:DATE,TIMESTAMP 目前不支援:decimal、binary、arrays、maps、structs、union型別; (4)、對於Hive分割槽表目前僅支援一次寫入單個分割槽; (5)、對於textfile需使用者保證寫入hdfs檔案的分隔符與在Hive上建立表時的分隔符一致,從而實現寫入hdfs資料與Hive表欄位關聯; (6)、HdfsWriter實現過程是:首先根據使用者指定的path,建立一個hdfs檔案系統上不存在的臨時目錄,建立規則:path_隨機;然後將讀取的檔案寫入這個臨時目錄;全部寫入後再將這個臨時目錄下的檔案移動到使用者指定目錄(在建立檔案時保證檔名不重複); 最後刪除臨時目錄。如果在中間過程發生網路中斷等情況造成無法與hdfs建立連線,需要使用者手動刪除已經寫入的檔案和臨時目錄。
檢視模板
datax.py -r mysqlreader -w hdfswriter
建立hive資料庫
create database dataxinfo;
建立表
CREATE TABLE IF NOT EXISTS xuqiu1( id STRING, name STRING, sum_score bigint, clazz STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
編寫配置檔案mysql2hdfs2.json
{ "job": { "content": [ { "reader": { "name": "mysqlreader", "parameter": { "column": ["*"], "connection": [ { "jdbcUrl": ["jdbc:mysql://master:3306/db?useUnicode=true&characterEncoding=utf-8"], "table": ["new_students"] } ], "password": "******", "username": "******" } }, "writer": { "name": "hdfswriter", "parameter": { "column": [ { "name": "id", "type": "int" }, { "name": "name", "type": "string" }, { "name": "email", "type": "string" }, { "name": "age", "type": "int" } ], "defaultFS": "hdfs://master:9000", "fieldDelimiter": ",", "fileName": "new_students", "fileType": "text", "path": "/user/hive/warehouse/dataxinfo.db/new_students", "writeMode": "append" } } } ], "setting": { "speed": { "channel": "1" } } } }
執行同步任務
datax.py mysql2hdfs2.json
此外還有MySQL2Hive、hive2mysql、mysql2hbase等。。。。