往期相关内容:
如何让 DataX 运行时加载自定义 transformer 插件
早该知道的一种更高级的 transformer 自定义方法。
前言
之前的文章有介绍过通过自定义 transformer 在 DataX 上实现 ETL(Extract Transform Load) 过程中定制化的数据处理,当时的实现方法是自定义插件并手写代码注册到com/alibaba/datax/core/transport/transformer/TransformerRegistry.java
文件中。
如下所示:
registTransformer(new SubstrTransformer());
registTransformer(new PadTransformer());
registTransformer(new ReplaceTransformer());
registTransformer(new FilterTransformer());
registTransformer(new GroovyTransformer());
这种方法有明显的缺点:当我们对 transformer 进行修改后,需要重新编译 dataX 的核心模块。显然这种做法的系统耦合性过大,完全不符合 DataX 系统重视插件机制的设计理念。
那么,有没有更好的方法呢?
官方文档提到了 Reader 和 Writer 的加载原理,依据相关做法,开发者可以仅编写编译自己要使用的插件,然后按要求包装后放到指定的位置,DataX 就会在启动后加载相关插件。
原代码告诉我,Transformer 也支持类似的加载方法。
核心的功能实现是由下面的 TransformerRegistry 类来完成的:
/*
com/alibaba/datax/core/transport/transformer/TransformerRegistry.java
*/
public static void loadTransformer(String each) {
String transformerPath = CoreConstant.DATAX_STORAGE_TRANSFORMER_HOME + File.separator + each;
Configuration transformerConfiguration;
try {
transformerConfiguration = loadTransFormerConfig(transformerPath);
} catch (Exception e) {
LOG.error(String.format("skip transformer(%s),load transformer.json error, path = %s, ", each, transformerPath), e