项目存在多源异构的问题,所以选取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