一、DataX Web是什么
DataX web是在DataX的基礎(chǔ)上開發(fā)的分布式的數(shù)據(jù)同步工具,方便DataX的用戶在網(wǎng)頁上通過點擊和配置就能完成DataX任務(wù)的配置和執(zhí)行等動作。同時,DataX web是基于xxl-job進(jìn)行二次開發(fā)的DataX任務(wù)管理后臺,天生支持任務(wù)定時調(diào)度、日志查看等功能,能幫助用戶更好地管理DataX任務(wù)。
因此,在學(xué)習(xí)使用DataX web之前,至少要了解過DataX和xxl-job,才能繼續(xù)下去。
二、為什么要使用DataX Web
DataX才是異構(gòu)數(shù)據(jù)源進(jìn)行數(shù)據(jù)同步的核心關(guān)鍵,DataX web只是為使用DataX提供了便利,因此DataX web的使用并不是必須的,但是作為一個追求高效率和簡化工作的工程師,好的工具必然不會放過。那么DataX web有哪些好處呢?
- 提供簡單易用的操作界面,降低用戶使用DataX的學(xué)習(xí)成本;
- 縮短任務(wù)配置時間,避免配置過程中出錯;
- 可通過頁面選擇數(shù)據(jù)源即可創(chuàng)建數(shù)據(jù)同步任務(wù),支持RDBMS、Hive、HBase、ClickHouse、MongoDB等數(shù)據(jù)源;
- RDBMS數(shù)據(jù)源可批量創(chuàng)建數(shù)據(jù)同步任務(wù);
- 支持實時查看數(shù)據(jù)同步進(jìn)度及日志并提供終止同步功能;
- 集成并二次開發(fā)xxl-job可根據(jù)時間、自增主鍵增量同步數(shù)據(jù);
- 任務(wù)"執(zhí)行器"支持集群部署,支持執(zhí)行器多節(jié)點路由策略選擇,支持超時控制、失敗重試、失敗告警、任務(wù)依賴;
- 支持對執(zhí)行器CPU、內(nèi)存、負(fù)載的監(jiān)控等等;
DataX web是如何工作的呢?

可以看到,整體的架構(gòu)和xxl-job基本類似,調(diào)度中心進(jìn)行任務(wù)的觸發(fā)和調(diào)度,同時監(jiān)控各個執(zhí)行器的執(zhí)行,匯總?cè)蝿?wù)的執(zhí)行過程和結(jié)果。
三、使用DataX Web進(jìn)行數(shù)據(jù)遷移
3.1 DataX Web的部署
官網(wǎng)文檔描述的很詳細(xì),參考:github.com
部署完成后,需要在執(zhí)行器管理菜單中新建一個可用的執(zhí)行器,選擇自動注冊即可。
3.2 MySQL數(shù)據(jù)導(dǎo)入Hive示例
假設(shè)已經(jīng)安裝好了MySQL和Hive,下面只是演示一個同步的過程。
首先我們在MySQL中創(chuàng)建一張表并插入一些演示數(shù)據(jù):
CREATE TABLE `zx_user` (
`user_id` bigint(20) NOT NULL COMMENT '用戶ID',
`user_name` varchar(30) DEFAULT NULL COMMENT '用戶姓名',
`age` int(11) DEFAULT NULL COMMENT '用戶年齡',
`user_email` varchar(50) DEFAULT NULL COMMENT '用戶郵箱',
`create_by` varchar(100) DEFAULT NULL,
`create_date` datetime DEFAULT NULL,
`update_by` varchar(100) DEFAULT NULL,
`update_date` datetime DEFAULT NULL,
`deleted` int(11) DEFAULT '0' COMMENT '0-未刪除;1-已刪除',
PRIMARY KEY (`user_id`),
UNIQUE KEY `zx_user_un` (`user_id`),
UNIQUE KEY `zx_user_un2` (`user_email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO zx_user (user_id,user_name,age,user_email,create_by,create_date,update_by,update_date,deleted) VALUES
(1,'Jone',18,'test1@baomidou.com',NULL,NULL,NULL,NULL,0),
(2,'Jack',20,'test2@baomidou.com',NULL,NULL,NULL,NULL,0),
(5,'Anna',27,'test5@baomidou.com',NULL,NULL,NULL,NULL,0),
(7,'Anna',27,'test7@baomidou.com','System','2021-06-17 14:36:03','System','2021-06-17 14:54:51',0),
(11,'slide',21,'slide@baomidou.com',NULL,NULL,NULL,NULL,0),
(21,'mify',20,'mify@baomidou.com',NULL,NULL,NULL,NULL,0),
(51,'kitty',27,'kitty@baomidou.com',NULL,NULL,NULL,NULL,0);
然后我們在Hive上也創(chuàng)建一張目標(biāo)表:
CREATE TABLE `zx_user` (
`user_id` bigint NOT NULL COMMENT '用戶ID',
`user_name` string COMMENT '用戶姓名',
`age` int COMMENT '用戶年齡',
`user_email` string COMMENT '用戶郵箱'
) comment "用戶信息表"
row format delimited fields terminated by ",";
以上表示,我們只需要同步MySQL中相同表的前4個字段,并且字段之間分隔符使用逗號。
然后我們打開DataX web的管理界面,在數(shù)據(jù)源管理里面,分別新建如上MySQL和Hive兩個數(shù)據(jù)源:

然后,我們開始新建一個任務(wù)模板,當(dāng)然這一步不是必須的,可以直接新建任務(wù),任務(wù)模板的優(yōu)點是后續(xù)可以從模板直接創(chuàng)建任務(wù),省區(qū)了重復(fù)填寫任務(wù)配置信息的繁瑣工作。

然后我們就開始進(jìn)行任務(wù)構(gòu)建,目標(biāo)是讓DataX web為我們自動生成需要的Json。
-
步驟一:設(shè)置Reader;
任務(wù)構(gòu)建_步驟一_設(shè)置Reader
-
步驟二:設(shè)置Writer;
任務(wù)構(gòu)建_步驟二_設(shè)置Writer -
步驟三:字段映射;
任務(wù)構(gòu)建_步驟三_字段映射
-
步驟四:生成Json并從模板創(chuàng)建任務(wù)
任務(wù)構(gòu)建_步驟四_生成Json并從模板創(chuàng)建任務(wù)
此時我們回到“任務(wù)管理”界面,就可以看到剛才新建的任務(wù)了。

默認(rèn)情況下,任務(wù)是停止?fàn)顟B(tài),我們將其打開,因為設(shè)置了每分鐘執(zhí)行一次,所以等一會,就可以看到“執(zhí)行狀態(tài)”字段變成了“已完成”,此時就可以查看執(zhí)行記錄和執(zhí)行日志了。

可以看到,前兩次運(yùn)行都是以失敗告終,最后修改了Json內(nèi)容才得以成功,詳情見第4.1節(jié)避坑記錄。我們在hive中執(zhí)行select操作,就可以看到導(dǎo)入的數(shù)據(jù)了。
3.3 Hive數(shù)據(jù)導(dǎo)入MySQL示例
假設(shè)已經(jīng)安裝好了MySQL和Hive,下面只是演示一個同步的過程。
在3.2案例的基礎(chǔ)上,我們清理MySQL中的用戶數(shù)據(jù):
truncate table zx_user;
然后我們在Datax web上重新構(gòu)建一個任務(wù),步驟基本和上面相似,只是步驟一種的Reader改為使用Hive數(shù)據(jù)源,步驟二種的Writer改為使用MySQL數(shù)據(jù)源,而且hdfs的路徑需要指定到具體的文件。
然后啟動執(zhí)行一次后,發(fā)現(xiàn)報錯如下:
01-29 13:25:22.878 [0-0-0-reader] ERROR StdoutPluginCollector - 臟數(shù)據(jù):
經(jīng)DataX智能分析,該任務(wù)最可能的錯誤原因是:
2023-01-29 11:29:32 [AnalysisStatistics.analysisStatisticsLog-53] com.alibaba.datax.common.exception.DataXException: Code:[Framework-14], Description:[DataX傳輸臟數(shù)據(jù)超過用戶預(yù)期,該錯誤通常是由于源端數(shù)據(jù)存在較多業(yè)務(wù)臟數(shù)據(jù)導(dǎo)致,請仔細(xì)檢查DataX匯報的臟數(shù)據(jù)日志信息, 或者您可以適當(dāng)調(diào)大臟數(shù)據(jù)閾值 .]. - 臟數(shù)據(jù)條數(shù)檢查不通過,限制是[0]條,但實際上捕獲了[7]條.
2023-01-29 11:29:32 [AnalysisStatistics.analysisStatisticsLog-53] at com.alibaba.datax.common.exception.DataXException.asDataXException(DataXException.java:30)
2023-01-29 11:29:32 [AnalysisStatistics.analysisStatisticsLog-53] at com.alibaba.datax.core.util.ErrorRecordChecker.checkRecordLimit(ErrorRecordChecker.java:58)
經(jīng)過排查,是因為DataX不支持所有的Hive數(shù)據(jù)類型,可以參考官方文檔:

我們需要將自動生成的json種的bigint、int類型全部轉(zhuǎn)換為Long才可以成功執(zhí)行任務(wù)。執(zhí)行成功后,再次查詢MySQL中的目標(biāo)表就能發(fā)現(xiàn)數(shù)據(jù)被成功導(dǎo)入了。
四、避坑記錄
4.1 MySQL數(shù)據(jù)導(dǎo)入Hive示例失敗
使用自動生成的json運(yùn)行DataX任務(wù)具體的報錯日志如下:
2023-01-29 09:55:45 [AnalysisStatistics.analysisStatisticsLog-53] com.alibaba.datax.common.exception.DataXException: Code:[Framework-03], Description:[DataX引擎配置錯誤,該問題通常是由于DataX安裝錯誤引起,請聯(lián)系您的運(yùn)維解決 .]. - 在有總bps限速條件下,單個channel的bps值不能為空,也不能為非正數(shù)
......
2023-01-29 09:55:45 [AnalysisStatistics.analysisStatisticsLog-53] 2023-01-29 09:55:45.437 [job-0] INFO StandAloneJobContainerCommunicator - Total 0 records, 0 bytes | Speed 0B/s, 0 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.000s | All Task WaitReaderTime 0.000s | Percentage 0.00%
2023-01-29 09:55:45 [AnalysisStatistics.analysisStatisticsLog-53] 2023-01-29 09:55:45.541 [job-0] ERROR Engine -
2023-01-29 09:55:45 [AnalysisStatistics.analysisStatisticsLog-53]
2023-01-29 09:55:45 [AnalysisStatistics.analysisStatisticsLog-53] 經(jīng)DataX智能分析,該任務(wù)最可能的錯誤原因是:
2023-01-29 09:55:45 [AnalysisStatistics.analysisStatisticsLog-53] com.alibaba.datax.common.exception.DataXException: Code:[Framework-03], Description:[DataX引擎配置錯誤,該問題通常是由于DataX安裝錯誤引起,請聯(lián)系您的運(yùn)維解決 .]. - 在有總bps限速條件下,單個channel的bps值不能為空,也不能為非正數(shù)
...
2023-01-29 09:55:45 [JobThread.run-165] <br>----------- datax-web job execute end(finish) -----------<br>----------- ReturnT:ReturnT [code=500, msg=command exit value(1) is failed, content=null]
2023-01-29 09:55:45 [TriggerCallbackThread.callbackLog-186] <br>----------- datax-web job callback finish.
按照提示信息,猜測錯誤的原因是json中指定了channel為3,并且限定總限速為1048576byte,但是DataX則是要求必須指定單個channel的限速bps。限速這塊內(nèi)容對于DataX入門小白來說可以先不用看,因此解決方案是把總限速給刪除即可。然后保存json,重新執(zhí)行任務(wù)就可以成功了。
五、總結(jié)
關(guān)于DataX和DataX web還有很多功能沒有實驗,本文僅作為入門體驗記錄一些過程,便于后續(xù)和別人上手。
體驗下來,DataX web確實能簡化DataX的任務(wù)管理和json的書寫,特別是還提供了定時任務(wù)的功能,但需要注意的是,自動生成的json并不是一定可靠的,比如3.3節(jié)中沒有支持Hive數(shù)據(jù)類型的自動轉(zhuǎn)換,需要使用者自己注意json的正確性。



