DataX实践趟坑大全

本文记录了在使用DataX进行数据同步时遇到的问题,包括不支持MySQL8.0、Null空值转换错误、类型转换问题以及依赖包缺失。针对这些问题,提供了详细的解决方案,如更新MySQL驱动、修改源码以及提供所需依赖包的下载链接。同时,文章也分享了解决这些问题后的部署和检查步骤。
摘要由CSDN通过智能技术生成

项目存在多源异构的问题,所以选取DataX做数据同步。实践过程中,发现了很多DataX的天坑。将问题和解决方法记录如下。

一.不支持mysql 8.0问题

1.现象
RetryUtil - Exception when calling callable, 即将尝试执行第1次重试.本次重试计划等待[1000]ms,实际等待[1000]ms, 
异常Msg:[Code:[DBUtilErrorCode-10], Description:[连接数据库失败. 请检查您的 账号、密码、数据库名称、IP、Port或者向 DBA 寻求帮助(注意网络环境).].  -  
具体错误信息为:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
2.解决方案

2.1.在github上下载DataX的源码
git clone git@github.com:alibaba/DataX.git
或者直接下载zip文件包,并解压缩到本地
导入IDEA方便修改
2.2 修改mysqlreader、mysqlwriter连接驱动
修改mysqlwriter\pom.xml里版本依赖
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
2.3 修改plugin-rdbms-util连接驱动
修改plugin-rdbms-util\pom.xml里版本依赖
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
2.4 修改DataBaseType源码
路径com.alibaba.datax.plugin.rdbms.util.DataBaseType
将com.mysql.jdbc.Driver修改为com.mysql.cj.jdbc.Driver;
将连接属性中的zeroDateTimeBehavior=convertToNull改为zeroDateTimeBehavior=CONVERT_TO_NULL;
2.5 重新编译
mvn -U clean package assembly:assembly -Dmaven.test.skip=true
2.6 将mysqlreader、mysqlwriter、plugin-rdbms-util工程重新部署
以mysqlwriter为例,分别部署自身jar包和依赖库
$ cd DataX-master\mysqlwriter\target\datax\plugin\writer\mysqlwriter\libs
$ ls
mysql-connector-java-8.0.19.jar
plugin-rdbms-util-0.0.1-SNAPSHOT.jar
$ cd DataX-master\mysqlwriter\target\datax\plugin\writer\mysqlwriter
$ ls 
mysqlwriter-0.0.1-SNAPSHOT.jar
2.7执行检查
执行python /opt/datax/bin/datax.py /opt/datax/job/job.json如果运行没报错则编译打包成功。

二.Null空值转换问题

1.现象
mysql部分int类型数据null转换为hive失败
{"message":"字段类型转换错误:你目标字段为[int]类型,实际字段值为[].","record":[{"byteSize":32,"index":0,"rawData":"00de1930475042198e3cc1e411b5d71c".........}]}
2.解决方法
2.1主要涉及hdfswriter工程,修改com.alibaba.datax.plugin.writer.hdfswriter.HdfsHelper源码
修改transportOneRecord()方法,将"
if (null != column.getRawData())
"改为"
if (null != column.getRawData() && column.getByteSize() > 0)
"
2.2重新打包部署
参照第一章节

三.类型转换问题

1.现象
将hive中的数据导入mysql时发生字段类型匹配失败
2021-07-03 14:50:59.834 [0-0-0-reader] ERROR StdoutPluginCollector - 脏数据:
{"message":"No enum constant com.alibaba.datax.plugin.reader.hdfsreader.DFSUtil.Type.DECIMAL","record":[xxxxxxxxxxxxxxxxx]}
2.解决方法
2.1主要涉及hdfsreader工程,修改com.alibaba.datax.plugin.reader.hdfsreader.DFSUtil源码
(1)添加枚举类型
将"
    private enum Type {
        STRING, LONG, BOOLEAN, DOUBLE, DATE,
    }
"改为"
    private enum Type {
        STRING, LONG, BOOLEAN, DOUBLE, DATE, DECIMAL,
    }
"

(2)修改模型匹配代码
修改transportOneRecord()方法,在switch (type) 中增加分支。
"
    case DECIMAL:
        try {
            columnGenerated = new DoubleColumn(columnValue);
        } catch (Exception e) {
            throw new IllegalArgumentException(String.format("类型转换错误, 无法将[%s] 转换为[%s]", columnValue,"DOUBLE(DECIMAL)"));
        }
        break;
"
简单用double类型替换decimal类型,如果缺失INT、FLOAT等类型修改步骤基本相似。
2.2重新打包部署
参照第一章节

四.依赖包问题

DataX由于集成了各类组件,依赖很多外包稀奇古怪的包,非常难找,尤其令人气愤的是有人还把包挂出来卖钱,令人发指。
将搜集依赖包开放给大家:
eigenbase-properties-1.1.4.jar
https://download.csdn.net/download/superman_wang/20159573
pentaho-aggdesigner-algorithm-5.1.5-jhyde.jar
https://download.csdn.net/download/superman_wang/20159824
calcite-avatica-1.6.0.jar
https://download.csdn.net/download/superman_wang/20159887

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值