【1】入口

ConfigParser::parse

datax配置数据源hive参数 datax 配置文件_datax配置数据源hive参数

 

 

 方法参数为命令行中指定的作业配置文件。

 

【2】配置保存方式

datax使用Configuration类保存作业配置,保存方式简单粗暴。Configuration类部分代码如下:

public class Configuration {

    /**
     * 对于加密的keyPath,需要记录下来
     * 为的是后面分布式情况下将该值加密后抛到DataXServer中
     */
    private Set<String> secretKeyPathSet = new HashSet<String>();

    private Object root = null;

加密暂时忽略,可以看到,Configuration类中仅有一个root变量。后面可以看到,这个root变量实际上是JSONObject对象。

通过Configuration类封装的一些方法,datax可直接通过path方式,获取到对应的配置。


【3】配置组成

datax加载了三部分配置,分别为:作业json文件配置、插件配置、默认配置。其中插件配置,又包含了本次作业插件与handler插件。

作业json文件配置

将作业json文件解析成字符串,之后再生成JSONObject对象。

这里有以下的点值得注意:

1、支持http方式获取配置文件
本文不对这部分进行详细讨论。这个点为datax可视化配置提供了方便,可以使用某个接口,返回作业配置文件。

2、配置文件支持变量
可以看到有对${xxxx}进行查找替换的代码,因此可推定,datax是支持使用${xxx}方式的变量的。通过肉眼看代码,这部分取的应该是系统环境变量。

    public static String replaceVariable(final String param) {
        Map<String, String> mapping = new HashMap<String, String>();

        Matcher matcher = VARIABLE_PATTERN.matcher(param);
        while (matcher.find()) {
            String variable = matcher.group(2);
            String value = System.getProperty(variable);
            if (StringUtils.isBlank(value)) {
                value = matcher.group();
            }
            mapping.put(matcher.group(), value);
        }

        String retString = param;
        for (final String key : mapping.keySet()) {
            retString = retString.replace(key, mapping.get(key));
        }

        return retString;
    }

3、支持加密字符串配置
因为配置文件中可能需要配置密码,因此datax支持了加密。
public static Configuration parseJobConfig(final String path) {
String jobContent = getJobContent(path); // 获取到配置文件的内容(可能来自网络)
    Configuration config = Configuration.from(jobContent);// 解析配置文件字符串

    return SecretUtil.decryptSecretKey(config);
}
这一点在几年前的版本中是没有的,本人在某银行工作时,改造过datax,采用类似方式实现了加密功能,并且编写了单独的可执行jar包,方便获取字符串的加密串。

解析作业文件之后的root变量:

datax配置数据源hive参数 datax 配置文件_json_02

 

 至此,作业文件的所有配置,都保存到了root中。

合并默认配置

datax配置数据源hive参数 datax 配置文件_datax配置数据源hive参数_03

 

 可以看到,datax合并了core.json中的默认配置。如果需要默认配置,可修改该文件。该文件在core工程下的src/main/conf目录下。

合并插件配置

datax获取作业配置文件中的读写插件名称、handler插件名称,并获取这些插件的配置。

当前版本代码中,这块的大体逻辑是:

遍历编译完成后的datax/plugin/reader(和writer)下的所有目录(大概几十个reader、writer吧),每一个都和插件名称对比,如果符合的话,就解析它的配置。

 

这块是可以优化一下的。倒不会提升多少性能,因为debug时,如果有很多目录,这里会循环很多次。

 一旦找到符合的插件名称,就会拼接出这样一个文件名称:

datax配置数据源hive参数 datax 配置文件_配置文件_04

 

 这个plugin.json,就是对应插件工程下的资源文件。从这个文件中可以提取到插件对应的Java类名,这就为实例化插件做好了准备:

datax配置数据源hive参数 datax 配置文件_字符串_05

 

 此时的配置是这样的:

datax配置数据源hive参数 datax 配置文件_datax配置数据源hive参数_06

 

也就是,作业文件配置、默认配置、插件配置,全都拿到了。

 

以上就是datax解析json配置文件的过程。