DataX介紹:
DataX 是阿里開源的一個異構(gòu)數(shù)據(jù)源離線同步工具悠抹,致力于實現(xiàn)包括關(guān)系型數(shù)據(jù)庫(MySQL、Oracle等)扩淀、HDFS楔敌、Hive、ODPS驻谆、HBase卵凑、FTP等各種異構(gòu)數(shù)據(jù)源之間穩(wěn)定高效的數(shù)據(jù)同步功能庆聘。
DataX設(shè)計理念
DataX本身作為數(shù)據(jù)同步框架,將不同數(shù)據(jù)源的同步抽象為從源頭數(shù)據(jù)源讀取數(shù)據(jù)的Reader插件勺卢,以及向目標(biāo)端寫入數(shù)據(jù)的Writer插件掏觉,理論上DataX框架可以支持任意數(shù)據(jù)源類型的數(shù)據(jù)同步工作。同時DataX插件體系作為一套生態(tài)系統(tǒng), 每接入一套新數(shù)據(jù)源該新加入的數(shù)據(jù)源即可實現(xiàn)和現(xiàn)有的數(shù)據(jù)源互通值漫。
DataX框架設(shè)計
DataX本身作為離線數(shù)據(jù)同步框架,采用Framework + plugin架構(gòu)構(gòu)建织盼。將數(shù)據(jù)源讀取和寫入抽象成為Reader/Writer插件杨何,納入到整個同步框架中。
1. Reader:Reader為數(shù)據(jù)采集模塊沥邻,負(fù)責(zé)采集數(shù)據(jù)源的數(shù)據(jù)危虱,將數(shù)據(jù)發(fā)送給Framework。
2. Writer: Writer為數(shù)據(jù)寫入模塊唐全,負(fù)責(zé)不斷向Framework取數(shù)據(jù)埃跷,并將數(shù)據(jù)寫入到目的端。
3. Framework:Framework用于連接reader和writer邮利,作為兩者的數(shù)據(jù)傳輸通道弥雹,并處理緩沖,流控延届,并發(fā)剪勿,數(shù)據(jù)轉(zhuǎn)換等核心技術(shù)問題。
DataX插件體系
DataX目前已經(jīng)有了比較全面的插件體系方庭,主流的RDBMS數(shù)據(jù)庫厕吉、NOSQL、大數(shù)據(jù)計算系統(tǒng)都已經(jīng)接入械念,目前支持?jǐn)?shù)據(jù)如下圖头朱,詳情請點擊:DataX數(shù)據(jù)源參考指南
DataX核心架構(gòu)
核心模塊介紹:
- DataX完成單個數(shù)據(jù)同步的作業(yè),我們稱之為Job龄减,DataX接受到一個Job之后项钮,將啟動一個進(jìn)程來完成整個作業(yè)同步過程。DataX Job模塊是單個作業(yè)的中樞管理節(jié)點欺殿,承擔(dān)了數(shù)據(jù)清理寄纵、子任務(wù)切分(將單一作業(yè)計算轉(zhuǎn)化為多個子Task)、TaskGroup管理等功能脖苏。
- DataXJob啟動后程拭,會根據(jù)不同的源端切分策略,將Job切分成多個小的Task(子任務(wù))棍潘,以便于并發(fā)執(zhí)行恃鞋。Task便是DataX作業(yè)的最小單元崖媚,每一個Task都會負(fù)責(zé)一部分?jǐn)?shù)據(jù)的同步工作。
- 切分多個Task之后恤浪,DataX Job會調(diào)用Scheduler模塊畅哑,根據(jù)配置的并發(fā)數(shù)據(jù)量,將拆分成的Task重新組合水由,組裝成TaskGroup(任務(wù)組)荠呐。每一個TaskGroup負(fù)責(zé)以一定的并發(fā)運(yùn)行完畢分配好的所有Task,默認(rèn)單個任務(wù)組的并發(fā)數(shù)量為5砂客。
- 每一個Task都由TaskGroup負(fù)責(zé)啟動泥张,Task啟動后,會固定啟動Reader—>Channel—>Writer的線程來完成任務(wù)同步工作鞠值。
- DataX作業(yè)運(yùn)行起來之后媚创, Job監(jiān)控并等待多個TaskGroup模塊任務(wù)完成,等待所有TaskGroup任務(wù)完成后Job成功退出彤恶。否則钞钙,異常退出,進(jìn)程退出值非0声离。
DataX執(zhí)行流程
1芒炼、解析配置,包括job.json术徊、core.json焕议、plugin.json三個配置
2、設(shè)置jobId到configuration當(dāng)中
3弧关、啟動Engine盅安,通過Engine.start()進(jìn)入啟動程序
4、設(shè)置RUNTIME_MODE到configuration當(dāng)中
5世囊、通過JobContainer的start()方法啟動
6别瞭、依次執(zhí)行job的preHandler()、init()株憾、prepare()蝙寨、split()、schedule()嗤瞎、- post()墙歪、postHandle()等方法。
7贝奇、init()方法涉及到根據(jù)configuration來初始化reader和writer插件虹菲,這里涉及到j(luò)ar包熱加載以及調(diào)用插件init()操作方法,同時設(shè)置reader和writer的configuration信息
8掉瞳、prepare()方法涉及到初始化reader和writer插件的初始化,通過調(diào)用插件的prepare()方法實現(xiàn),每個插件都有自己的jarLoader掸屡,通過集成URLClassloader實現(xiàn)而來
9、split()方法通過adjustChannelNumber()方法調(diào)整channel個數(shù)掏秩,同時執(zhí)行reader和writer最細(xì)粒度的切分,需要注意的是,writer的切分結(jié)果要參照reader的切分結(jié)果,達(dá)到切分后數(shù)目相等响谓,才能滿足1:1的通道模型
10、channel的計數(shù)主要是根據(jù)byte和record的限速來實現(xiàn)的(如果自己沒有設(shè)置了channel的個數(shù))省艳,在split()的函數(shù)中第一步就是計算channel的大小
11歌粥、split()方法reader插件會根據(jù)channel的值進(jìn)行拆分,但是有些reader插件可能不會參考channel的值拍埠,writer插件會完全根據(jù)reader的插件1:1進(jìn)行返回
12、split()方法內(nèi)部的mergeReaderAndWriterTaskConfigs()負(fù)責(zé)合并reader土居、writer枣购、以及transformer三者關(guān)系,生成task的配置擦耀,并且重寫job.content的配置
13棉圈、schedule()方法根據(jù)split()拆分生成的task配置分配生成taskGroup對象,根據(jù)task的數(shù)量和單個taskGroup支持的task數(shù)量進(jìn)行配置眷蜓,兩者相除就可以得出taskGroup的數(shù)量14分瘾、schdule()內(nèi)部通過AbstractScheduler的schedule()執(zhí)行,繼續(xù)執(zhí)行startAllTaskGroup()方法創(chuàng)建所有的TaskGroupContainer組織相關(guān)的task吁系,TaskGroupContainerRunner負(fù)責(zé)運(yùn)行TaskGroupContainer執(zhí)行分配的task德召。
15、taskGroupContainerExecutorService啟動固定的線程池用以執(zhí)行TaskGroupContainerRunner對象汽纤,TaskGroupContainerRunner的run()方法調(diào)用taskGroupContainer.start()方法上岗,針對每個channel創(chuàng)建一個TaskExecutor,通過taskExecutor.doStart()啟動任務(wù)蕴坪。
DataX和sqoop的比較
我們公司用的是sqoop肴掷,針對自身總結(jié)的缺點:
1.由于mysql的表結(jié)構(gòu)變更,引起的數(shù)據(jù)抽取失敗背传。(目前添加監(jiān)控呆瞻,自動更改還需要開發(fā))
2.抽取速度有待提高,對于大表径玖,指定多個map痴脾,可能會導(dǎo)致數(shù)據(jù)重復(fù),需要單獨做處理梳星。
3.不支持mongoDB
4.啟動的速度比較慢
在測試DataX中發(fā)現(xiàn)的問題:
1.目前公司表中基本上沒有自增主鍵明郭,對于數(shù)據(jù)量大的表(目前數(shù)據(jù)量還有待測試)买窟,抽取速度慢(6千萬的表7116rec/s,兩千萬的速度在7902rec/s,1千萬的表在19307rec/s 左右)薯定,如果有自增主鍵或者整型的索引字段始绍,速度是56716rec/s ,使用uuid生成的主鍵话侄,會存在主鍵切分不均勻現(xiàn)象(可以修改源碼)亏推。
2.目前開源版本只支持單機(jī)模式,需要依賴調(diào)度系統(tǒng)(在每個節(jié)點上部署客戶端)
3.不支持自動創(chuàng)建表和分區(qū)年堆,寫入的hdfs路徑必須存在(可以后期修改源代碼吞杭,或者使用腳本生成)
4.生成配置文件比較繁瑣(每張表需要生成一張配置文件,可以使用代碼生成)
DataX的優(yōu)點總結(jié)
1.除比較大的表之外变丧,速度明顯比sqoop快(表數(shù)據(jù)量3000萬分界點并且表沒有自增的整型主鍵芽狗,前面是sqoop 22:27 - 35:58 一共751s,后面是指定5個channel時間162s,第三個是一個channel時間是471s痒蓬,大表sqoop也比較慢童擎,使用多個map,然后去重攻晒,分為兩個階段)顾复。
2.Datax的速度可以配置,可以根據(jù)我們的實際情況控制
3.日志相比于sqoop比較完善和人性化鲁捏。
4.對于臟數(shù)據(jù)的處理
- 在大量數(shù)據(jù)的傳輸過程中芯砸,必定會由于各種原因?qū)е潞芏鄶?shù)據(jù)傳輸報錯(比如類型轉(zhuǎn)換錯誤),這種數(shù)據(jù)DataX認(rèn)為就是臟數(shù)據(jù)给梅。DataX目前可以實現(xiàn)臟數(shù)據(jù)精確過濾假丧、識別、采集动羽、展示虎谢,提供多種的臟數(shù)據(jù)處理模式。
- Job支持用戶對于臟數(shù)據(jù)的自定義監(jiān)控和告警曹质,包括對臟數(shù)據(jù)最大記錄數(shù)閾值(record值)或者臟數(shù)據(jù)占比閾值(percentage值)婴噩,當(dāng)Job傳輸過程出現(xiàn)的臟數(shù)據(jù)大于用戶指定的數(shù)量/百分比,DataX Job報錯退出羽德。
- 圖中的配置的意思是當(dāng)臟數(shù)據(jù)大于10條几莽,或者臟數(shù)據(jù)比例達(dá)到0.05%,任務(wù)就會報錯
5.健壯的容錯機(jī)制:DataX作業(yè)是極易受外部因素的干擾宅静,網(wǎng)絡(luò)閃斷章蚣、數(shù)據(jù)源不穩(wěn)定等因素很容易讓同步到一半的作業(yè)報錯停止。因此穩(wěn)定性是DataX的基本要求,在DataX 3.0的設(shè)計中纤垂,重點完善了框架和插件的穩(wěn)定性矾策。
6.豐富的數(shù)據(jù)轉(zhuǎn)換功能
DataX作為一個服務(wù)于大數(shù)據(jù)的ETL工具,除了提供數(shù)據(jù)快照搬遷功能之外峭沦,還提供了豐富數(shù)據(jù)轉(zhuǎn)換的功能贾虽,讓數(shù)據(jù)在傳輸過程中可以輕松完成數(shù)據(jù)脫敏,補(bǔ)全吼鱼,過濾等數(shù)據(jù)轉(zhuǎn)換功能蓬豁,另外還提供了自動groovy函數(shù),讓用戶自定義轉(zhuǎn)換函數(shù)菇肃。
輕易科技研發(fā)中心 管理臺研發(fā) 柴曉雪