1. 程式人生 > 其它 >DataX原始碼分配三:配置載入

DataX原始碼分配三:配置載入

【1】入口

ConfigParser::parse

 方法引數為命令列中指定的作業配置檔案。

【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變數:

 至此,作業檔案的所有配置,都儲存到了root中。

合併預設配置

 可以看到,datax合併了core.json中的預設配置。如果需要預設配置,可修改該檔案。該檔案在core工程下的src/main/conf目錄下。

合併外掛配置

datax獲取作業配置檔案中的讀寫外掛名稱、handler外掛名稱,並獲取這些外掛的配置。

當前版本程式碼中,這塊的大體邏輯是:

遍歷編譯完成後的datax/plugin/reader(和writer)下的所有目錄(大概幾十個reader、writer吧),每一個都和外掛名稱對比,如果符合的話,就解析它的配置。

這塊是可以優化一下的。倒不會提升多少效能,因為debug時,如果有很多目錄,這裡會迴圈很多次。

 一旦找到符合的外掛名稱,就會拼接出這樣一個檔名稱:

 這個plugin.json,就是對應外掛工程下的資原始檔。從這個檔案中可以提取到外掛對應的Java類名,這就為例項化外掛做好了準備:

 此時的配置是這樣的:

也就是,作業檔案配置、預設配置、外掛配置,全都拿到了。

以上就是datax解析json配置檔案的過程。