datax 優化設置


 

 

Datax的執行過程

要想進行調優,一般先要了解執行過程,執行過程如下:


過程詳細說明如下:

  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 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並發有三種配置方式:

  1. 配置全局Byte限速以及單Channel Byte限速,Channel個數 = 全局Byte限速 / 單Channel Byte限速
  2. 配置全局Record限速以及單Channel Record限速,Channel個數 = 全局Record限速 / 單Channel Record限速
  3. 直接配置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測試不出來效果

調優沒有固定的,先了解原理,再根據原理及執行過程進行局部或者全局的調優,謝謝各位閱讀

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM