数据同步过程中的数据转换——DataX Transformer实践
前言
最近遇到一个需求,需要从一个表里读取数据,并解密其中一个字段,然后写入另一个表中,表的数据量大概是一千多万,听上去是一个很简单的需求。我手上正好有一个日常在用的Springboot + MyBatis-Plus的框架,我想着直接用MyBatis-Plus3.5.4开始支持的一个流式查询来完成这一功能,但是实践起来发现数据同步的效率十分低。后来想到可不可以用DataX来做数据同步,因为DataX作为一个数据同步工具,效率十分高,去看了DataX的官网,发现它支持数据转换功能,它提供了Transformer来帮助我们实现一些数据传输过程中定制化的需求。
原理
Transformer在DataX的架构中介于Reader和Writer之间,每一条数据记录(Record)从Reader进入Transformer过程后,根据配置文件中指定的字段,对字段进行一些逻辑处理,并将处理后的数据更新到Record对应字段中,然后输出到Writer。我们可以自定义那部分处理逻辑,以实现我们的定制化需求。
实践
第一步:拉取DataX源码、下载DataX
- 进入到阿里DataX的官网
- 通过git拉取DataX源码
- 下载官方已经给我们提供的DataX(文档往下滑,有个DataX下载地址)
第二步:源码解读
- 一步步的解读源码可以帮助我们快速分析出他的代码结构,并帮助我们找到 我们应该在哪里开发我们自己的定制化代码
- 在拉下来的代码中找到transformer模块,我们可以看到里面只有两个抽象类,一个是复杂型Transformer,一个是普通的Transformer
- 我们点到普通的Transformer类中,发现这是一个抽象类,其中evaluate方法的注释告诉我们这个方法就是核心的处理逻辑,于是我们猜测想要实现自定义的transformer得继承这个类并实现里面的evaluate方法。双击类名,
Ctrl + H
打开该类的血缘结构,可以看到下面有很多的实现类,是官方已经写好的可以直接提供给我们使用的transformer,我们随便点一个双击进去。
- 可以看到这个FilterTransformer实现类继承了Transformer父类,同时实现了evaluate方法,并在里面写了具体的处理逻辑,我们之前的猜想也得到了应验。现在我们需要定位FilterTransformer这个类文件的位置,点击左侧目录上面的定位按钮,找到这个文件在core模块下的其中一个叫transformer文件夹中,这里面还有其他的Transformer实现类,我们后面要自定义的逻辑代码也将写在这一部分。
第三步:自定义Transformer实现类
- 这里我的业务逻辑是需要实现一个加密解密,我需要用到hutool中的SecureUtil工具类进行我的加密解密操作,因此在core模块的pom文件中添加了hutool的依赖
- 同时找到util文件夹下,创建我们自己的工具类,将加密解密的逻辑提取到一个工具类中,与业务解耦
package com.alibaba.datax.core.util;
import cn.hutool.crypto.SecureUtil;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
public class AesUtil {
public final static byte[] KEY = "123456".getBytes(StandardCharsets.UTF_8);
//加密
public static String encrypt(String value) {
if (Objects.isNull(value)){
return null;
}
return SecureUtil.aes(KEY).encryptHex(value);
}
//解密
public static String decrypt(String value) {
if (Objects.isNull(value)){
return null;