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 Job會切分成多個Task,每個Task會按TaskGroup進行分組,一個Task內部會有一組Reader->Channel->Writer。Channel是連接Reader和Writer的數據交換通道,所有的數據都會經由Channel進行傳輸
根據過程,我們可以進行如下優化
優化1:提升每個channel的速度
在DataX內部對每個Channel會有嚴格的速度控制,分兩種,一種是控制每秒同步的記錄數,另外一種是每秒同步的字節數,默認的速度限制是1MB/s,可以根據具體硬件情況設置這個byte速度或者record速度,一般設置byte速度,比如:我們可以把單個Channel的速度上限配置為5MB
優化2:提升DataX Job內Channel並發數 並發數=taskGroup的數量每一個TaskGroup並發執行的Task數 (默認單個任務組的並發數量為5)。
提升job內Channel並發有三種配置方式:
- 配置全局Byte限速以及單Channel Byte限速,Channel個數 = 全局Byte限速 / 單Channel Byte限速
- 配置全局Record限速以及單Channel Record限速,Channel個數 = 全局Record限速 / 單Channel Record限速
- 直接配置Channel個數.
配置含義:
job.setting.speed.channel : channel並發數
job.setting.speed.record : 全局配置channel的record限速
job.setting.speed.byte:全局配置channel的byte限速
core.transport.channel.speed.record:單channel的record限速
core.transport.channel.speed.byte:單channel的byte限速
方式1:
舉例如下:core.transport.channel.speed.byte=1048576,job.setting.speed.byte=5242880,所以Channel個數 = 全局Byte限速 / 單Channel Byte限速=5242880/1048576=5個,配置如下:
{ "core": { "transport": { "channel": { "speed": { "byte": 1048576 } } } }, "job": { "setting": { "speed": { "byte" : 5242880 } }, ... } }
方式2:
舉例如下:core.transport.channel.speed.record=100,job.setting.speed.record=500,所以配置全局Record限速以及單Channel Record限速,Channel個數 = 全局Record限速 / 單Channel Record限速=500/100=5
{ "core": { "transport": { "channel": { "speed": { "record": 100 } } } }, "job": { "setting": { "speed": { "record" : 500 } }, ... } }
方式3:
舉例如下:直接配置job.setting.speed.channel=5,所以job內Channel並發=5個
{ "job": { "setting": { "speed": { "channel" : 5 } }, ... } }
注意事項
- 當提升DataX Job內Channel並發數時,調整JVM heap參數,原因如下:
- 當一個Job內Channel數變多后,內存的占用會顯著增加,因為DataX作為數據交換通道,在內存中會緩存較多的數據。 - 例如Channel中會有一個Buffer,作為臨時的數據交換的緩沖區,而在部分Reader和Writer的中,也會存在一些Buffer,為了防止jvm報內存溢出等錯誤,調大jvm的堆參數。 - 通常我們建議將內存設置為4G或者8G,這個也可以根據實際情況來調整 - 調整JVM xms xmx參數的兩種方式:一種是直接更改datax.py;另一種是在啟動的時候,加上對應的參數,如下: python datax/bin/datax.py --jvm="-Xms8G -Xmx8G" XXX.json
- Channel個數並不是越多越好, 原因如下:
- Channel個數的增加,帶來的是更多的CPU消耗以及內存消耗。 - 如果Channel並發配置過高導致JVM內存不夠用,會出現的情況是發生頻繁的Full GC,導出速度會驟降,適得其反。這個可以通過觀察日志發現
測試使用datax從mysql到mysql,不同配置測試效果如下:
使用默認單個channel 限速1M/s,測試情況如下,1660s跑完:
使用單通道,5M/s,測試情況如下,50s跑完:
使用5通道,5M/s,測試情況如下,10s跑完:
注意:
MysqlReader進行數據抽取時,如果指定splitPk,表示用戶希望使用splitPk代表的字段進行數據分片,DataX因此會啟動並發任務進行數據同步,這樣可以大大提供數據同步的效能,splitPk不填寫,包括不提供splitPk或者splitPk值為空,DataX視作使用單通道同步該表數據,第三個測試不配置splitPk測試不出來效果
調優沒有固定的,先了解原理,再根據原理及執行過程進行局部或者全局的調優,謝謝各位閱讀