dataX整合dataX-Web经验总结:
近日公司由于框架升级而涉及到数据的迁移,使用到了dataX的ETL框架,其中遇到了一些坑在此总结一下方便后人使用。
1.java8
2.python 2.7.18 (官方推荐是2.7.X,具体可自行选择)
3.maven
4.dataX源码 https://github.com/alibaba/DataX
5.dataXWeb 源码 https://github.com/WeiYe-Jing/datax-web
6.数据库是从oracle -> mysql
dataXWeb开发环境部署:https://github.com/WeiYe-Jing/datax-web/blob/master/userGuid.md
dataX建议下载已经发布的包,解压即可使用,下载地址可自行搜索这里就不放了。
遇到的小坑:
1.python的环境变量配置名字要精确为PYTHON_HOME,否则程序执行任务会报找不到python环境。
1.dataX由于本身不支持mysql8所以需要我们重新编译源码来更换驱动和添加时区(mysql8连接需要设置时区)
clone dataX源码并用maven构建导入需要的jar包,项目导包完成之后我们找到com.alibaba.datax.plugin.rdbms.util.DataBaseType类,设置zeroDateTimeBehavior=CONVERT_TO_NULL并且在后面添加时区。
找到源码中mysqlreader和mysqlwriter修改pom文件中mysql的连接驱动为对应的mysql8的驱动,比如我这里用的是8.0.21版本
使用maven构建工具进行打包
打包完成之后我们可以在mysqlreader和mysqlwriter中的target目录发现下列文件
将生成的mysqlreader和mysqlwriter与我们之前下载解压的dataX中对应的目录替换即可(推荐先备份,删除然后直接复制目录进去)
dataX目录地址: [你的dataX解压目录]\plugin\reader\mysqlreader
[你的dataX解压目录]\plugin\writer\mysqlwriter
至此我们的dataX就可以连接mysql8的数据库了。
按照官方文档上的部署方法部署成功之后,我们访问http://127.0.0.1:8080/index.html地址可以跳转到登录界面
账户:admin
密码:123456
1.创建项目
2.配置数据源(源库和目标库)
3.构建任务(需要先添加dataX任务模板,这里只是测试一下所以不多详细介绍,信息基本填默认的就可以)
按照步骤构建好任务,最后一步点构建会生成一个json格式的模板,注意json中的reader和writer的列顺序要一致,然后选择模板点下一步就创建成功了。
4.在任务管理栏中选择对应任务的操作即可运行。
遇到的坑:
数据类型转换错误
在实际使用场景中遇到了String类型转换为datetime类型的异常,因为原表中的varchar存储的是一个空格,所以dataX在转换的时候会报脏数据,需要我们自己添加转换器将数据转换,也可以使用自带的"dx_groovy"的转换器,但是个人觉得在json里面写groovy代码太蛋疼了,所以我自己针对相应业务定制了一个Transformer ,下面会介绍自定义transformer怎么使用。
1.在json文件中导入transformer。name是我们自定义的transformer名字,parameter是我们要传的参数
2.编写自定义transformer
在dataX项目源码中找到core(datax-core)中com.alibaba.datax.core.transport.transformer新建自己的transformer类
public class CcptAgreeInfoTransformer extends Transformer {
public CcptAgreeInfoTransformer() {setTransformerName("dx_ccptagreeinfo");}
// 具体逻辑自行编写
@Override
public Record evaluate(Record record, Object... paras) {
int columnIndex;
columnIndex = (int) paras[0];
Column column = record.getColumn(columnIndex);
if (columnIndex == 25) {
if (" ".equals(column.asString()) || StringUtils.isEmpty(column.asString())) {
record.setColumn(columnIndex, new LongColumn(1));
}
return record;
}
if (" ".equals(column.asString())) {
record.setColumn(columnIndex, new StringColumn());
}
return record;
}
}
在TransformerRegistry类中注册自己编写的转换器
然后使用maven编译 (compiler),将编译好的class扔进我们datax的core jar包中对应的位置(用解压工具打开jar包,TransformerRegistry类替换掉,也可以打包整包替换,但是耗时就长一些)
jar 包地址:[dataX解压目录]\lib\datax-core-0.0.1-SNAPSHOT.jar
3.使用自定义的transformer想要对相关数据进行操作的话,columnIndex这个参数是必须要传的,否则会报错(日志可见)
4.如果构建任务时使用sql语句来读取列,sql语句后不要加分号,因为可能会报invalid character错误。
5 datax开启debug的方法,在任务管理中选择编辑任务,找到jvm启动参数加入下列参数:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
然后在datax源码的IDEA中配置对应的remote debug即可