欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

dataX和dataX-Web使用总结

程序员文章站 2024-03-25 11:19:40
...

dataX整合dataX-Web经验总结:

近日公司由于框架升级而涉及到数据的迁移,使用到了dataX的ETL框架,其中遇到了一些坑在此总结一下方便后人使用。

1.环境准备

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环境。

 

2.开始迁移

I 准备工作:mysql8的兼容(如果不是mysql8可忽略)

1.dataX由于本身不支持mysql8所以需要我们重新编译源码来更换驱动和添加时区(mysql8连接需要设置时区)

clone dataX源码并用maven构建导入需要的jar包,项目导包完成之后我们找到com.alibaba.datax.plugin.rdbms.util.DataBaseType类,设置zeroDateTimeBehavior=CONVERT_TO_NULL并且在后面添加时区。

dataX和dataX-Web使用总结

 

 

dataX和dataX-Web使用总结

找到源码中mysqlreader和mysqlwriter修改pom文件中mysql的连接驱动为对应的mysql8的驱动,比如我这里用的是8.0.21版本

dataX和dataX-Web使用总结

 

使用maven构建工具进行打包

dataX和dataX-Web使用总结

 

打包完成之后我们可以在mysqlreader和mysqlwriter中的target目录发现下列文件

dataX和dataX-Web使用总结

 

将生成的mysqlreader和mysqlwriter与我们之前下载解压的dataX中对应的目录替换即可(推荐先备份,删除然后直接复制目录进去)

dataX目录地址: [你的dataX解压目录]\plugin\reader\mysqlreader

[你的dataX解压目录]\plugin\writer\mysqlwriter

dataX和dataX-Web使用总结

 

至此我们的dataX就可以连接mysql8的数据库了。

II 使用dataX-web构建任务:

按照官方文档上的部署方法部署成功之后,我们访问http://127.0.0.1:8080/index.html地址可以跳转到登录界面

账户:admin

密码:123456

dataX和dataX-Web使用总结

 

1.创建项目

dataX和dataX-Web使用总结

 

2.配置数据源(源库和目标库)

dataX和dataX-Web使用总结

 

 

dataX和dataX-Web使用总结

3.构建任务(需要先添加dataX任务模板,这里只是测试一下所以不多详细介绍,信息基本填默认的就可以)

按照步骤构建好任务,最后一步点构建会生成一个json格式的模板,注意json中的reader和writer的列顺序要一致,然后选择模板点下一步就创建成功了。

dataX和dataX-Web使用总结

 

 

dataX和dataX-Web使用总结

4.在任务管理栏中选择对应任务的操作即可运行。

遇到的坑:

  1. 数据类型转换错误

    在实际使用场景中遇到了String类型转换为datetime类型的异常,因为原表中的varchar存储的是一个空格,所以dataX在转换的时候会报脏数据,需要我们自己添加转换器将数据转换,也可以使用自带的"dx_groovy"的转换器,但是个人觉得在json里面写groovy代码太蛋疼了,所以我自己针对相应业务定制了一个Transformer ,下面会介绍自定义transformer怎么使用。

    1.在json文件中导入transformer。name是我们自定义的transformer名字,parameter是我们要传的参数

    dataX和dataX-Web使用总结

     

    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类中注册自己编写的转换器

dataX和dataX-Web使用总结

然后使用maven编译 (compiler),将编译好的class扔进我们datax的core jar包中对应的位置(用解压工具打开jar包,TransformerRegistry类替换掉,也可以打包整包替换,但是耗时就长一些)

jar 包地址:[dataX解压目录]\lib\datax-core-0.0.1-SNAPSHOT.jar

dataX和dataX-Web使用总结

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即可

dataX和dataX-Web使用总结