一、DataX Web是什么
DataX web是在DataX的基础上开发的分布式的数据同步工具,方便DataX的用户在网页上通过点击和配置就能完成DataX任务的配置和执行等动作。同时,DataX web是基于xxl-job进行二次开发的DataX任务管理后台,天生支持任务定时调度、日志查看等功能,能帮助用户更好地管理DataX任务。
因此,在学习使用DataX web之前,至少要了解过DataX和xxl-job,才能继续下去。
二、为什么要使用DataX Web
DataX才是异构数据源进行数据同步的核心关键,DataX web只是为使用DataX提供了便利,因此DataX web的使用并不是必须的,但是作为一个追求高效率和简化工作的工程师,好的工具必然不会放过。那么DataX web有哪些好处呢?
- 提供简单易用的操作界面,降低用户使用DataX的学习成本;
- 缩短任务配置时间,避免配置过程中出错;
- 可通过页面选择数据源即可创建数据同步任务,支持RDBMS、Hive、HBase、ClickHouse、MongoDB等数据源;
- RDBMS数据源可批量创建数据同步任务;
- 支持实时查看数据同步进度及日志并提供终止同步功能;
- 集成并二次开发xxl-job可根据时间、自增主键增量同步数据;
- 任务"执行器"支持集群部署,支持执行器多节点路由策略选择,支持超时控制、失败重试、失败告警、任务依赖;
- 支持对执行器CPU、内存、负载的监控等等;
DataX web是如何工作的呢?
可以看到,整体的架构和xxl-job基本类似,调度中心进行任务的触发和调度,同时监控各个执行器的执行,汇总任务的执行过程和结果。
三、使用DataX Web进行数据迁移
3.1 DataX Web的部署
官网文档描述的很详细,参考:github.com
部署完成后,需要在执行器管理菜单中新建一个可用的执行器,选择自动注册即可。
3.2 MySQL数据导入Hive示例
假设已经安装好了MySQL和Hive,下面只是演示一个同步的过程。
首先我们在MySQL中创建一张表并插入一些演示数据:
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上也创建一张目标表:
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的管理界面,在数据源管理里面,分别新建如上MySQL和Hive两个数据源:
然后,我们开始新建一个任务模板,当然这一步不是必须的,可以直接新建任务,任务模板的优点是后续可以从模板直接创建任务,省区了重复填写任务配置信息的繁琐工作。
然后我们就开始进行任务构建,目标是让DataX web为我们自动生成需要的Json。
-
步骤一:设置Reader;
-
步骤二:设置Writer;
-
步骤三:字段映射;
-
步骤四:生成Json并从模板创建任务
此时我们回到“任务管理”界面,就可以看到刚才新建的任务了。
默认情况下,任务是停止状态,我们将其打开,因为设置了每分钟执行一次,所以等一会,就可以看到“执行状态”字段变成了“已完成”,此时就可以查看执行记录和执行日志了。
可以看到,前两次运行都是以失败告终,最后修改了Json内容才得以成功,详情见第4.1节避坑记录。我们在hive中执行select操作,就可以看到导入的数据了。
3.3 Hive数据导入MySQL示例
假设已经安装好了MySQL和Hive,下面只是演示一个同步的过程。
在3.2案例的基础上,我们清理MySQL中的用户数据:
truncate table zx_user;
然后我们在Datax web上重新构建一个任务,步骤基本和上面相似,只是步骤一种的Reader改为使用Hive数据源,步骤二种的Writer改为使用MySQL数据源,而且hdfs的路径需要指定到具体的文件。
然后启动执行一次后,发现报错如下:
01-29 13:25:22.878 [0-0-0-reader] ERROR StdoutPluginCollector - 脏数据:
经DataX智能分析,该任务最可能的错误原因是:
2023-01-29 11:29:32 [AnalysisStatistics.analysisStatisticsLog-53] com.alibaba.datax.common.exception.DataXException: Code:[Framework-14], Description:[DataX传输脏数据超过用户预期,该错误通常是由于源端数据存在较多业务脏数据导致,请仔细检查DataX汇报的脏数据日志信息, 或者您可以适当调大脏数据阈值 .]. - 脏数据条数检查不通过,限制是[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)
经过排查,是因为DataX不支持所有的Hive数据类型,可以参考官方文档:
我们需要将自动生成的json种的bigint、int类型全部转换为Long才可以成功执行任务。执行成功后,再次查询MySQL中的目标表就能发现数据被成功导入了。
四、避坑记录
4.1 MySQL数据导入Hive示例失败
使用自动生成的json运行DataX任务具体的报错日志如下:
2023-01-29 09:55:45 [AnalysisStatistics.analysisStatisticsLog-53] com.alibaba.datax.common.exception.DataXException: Code:[Framework-03], Description:[DataX引擎配置错误,该问题通常是由于DataX安装错误引起,请联系您的运维解决 .]. - 在有总bps限速条件下,单个channel的bps值不能为空,也不能为非正数
......
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] 经DataX智能分析,该任务最可能的错误原因是:
2023-01-29 09:55:45 [AnalysisStatistics.analysisStatisticsLog-53] com.alibaba.datax.common.exception.DataXException: Code:[Framework-03], Description:[DataX引擎配置错误,该问题通常是由于DataX安装错误引起,请联系您的运维解决 .]. - 在有总bps限速条件下,单个channel的bps值不能为空,也不能为非正数
...
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。限速这块内容对于DataX入门小白来说可以先不用看,因此解决方案是把总限速给删除即可。然后保存json,重新执行任务就可以成功了。
五、总结
关于DataX和DataX web还有很多功能没有实验,本文仅作为入门体验记录一些过程,便于后续和别人上手。
体验下来,DataX web确实能简化DataX的任务管理和json的书写,特别是还提供了定时任务的功能,但需要注意的是,自动生成的json并不是一定可靠的,比如3.3节中没有支持Hive数据类型的自动转换,需要使用者自己注意json的正确性。