dataX和dataX-Web使用总结

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使用总结_第1张图片

 

 

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

dataX和dataX-Web使用总结_第2张图片

 

使用maven构建工具进行打包

dataX和dataX-Web使用总结_第3张图片

 

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

dataX和dataX-Web使用总结_第4张图片

 

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

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

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

dataX和dataX-Web使用总结_第5张图片

 

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

II 使用dataX-web构建任务:

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

账户:admin

密码:123456

dataX和dataX-Web使用总结_第6张图片

 

1.创建项目

 

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

dataX和dataX-Web使用总结_第7张图片

 

 

dataX和dataX-Web使用总结_第8张图片

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

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

dataX和dataX-Web使用总结_第9张图片

 

 

dataX和dataX-Web使用总结_第10张图片

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

遇到的坑:

  1. 数据类型转换错误

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

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

    dataX和dataX-Web使用总结_第11张图片

     

    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使用总结_第12张图片

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

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

dataX和dataX-Web使用总结_第13张图片

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使用总结_第14张图片

 

你可能感兴趣的:(学习中...,java,mysql)