用DataX導資料到Clickhouse遇到的坑

大資料技術前線發表於2023-11-02

來源:安瑞哥是碼農

這兩天在幫一個專案部署 Clickhouse (下稱CK),並且需要將上游的資料給匯入到其中。


由於只是一個單純的上游資料匯入,暫時還不涉及到對資料的計算和處理,所以就想著用一個合適的資料匯入工具來滿足這個需求。


於是,我就想到了DataX(因為之前用過的CK外部表+物化檢視的方式突然在當前環境下啞火了)。


原本以為就是一個簡單的資料傳輸,用這個號稱功能強大的傳輸工具,應該手到擒來才對,但不曾想,這玩意的坑不少。



0. 下載和部署


由於第一次在文章中寫關於DataX的內容,先簡單聊下我對這個工具的認識。


DataX是一個以Python語言為外殼,Java語言為核心的多執行緒資料傳輸軟體,它的一大特點是,對資料來源的讀取,以及向資料目的地的寫入,是透過一個個「外掛」來實現的。


所以對於DataX來說,想要實現一個完整的資料傳輸功能,就必須包含兩大部分。


第一部分為DataX的軟體主體(DataX工具包):


這個是使用 DataX 的基礎,透過官方提供的下載地址,下載下來後是一個壓縮包。


用DataX導資料到Clickhouse遇到的坑


解壓後,跟很多普通軟體一樣目錄結構是這樣的:


用DataX導資料到Clickhouse遇到的坑


這部分包含了DataX的核心啟動程式,以及資料傳輸時需要依賴的基礎環境。


第二個為外掛部分:


這個外掛,可以根據你不同的資料儲存(比如各種資料庫,檔案系統等)的版本、特點來進行編碼(實現特定的介面),最後打包成DataX規範的目錄結構,然後將其上傳到對應的 plugin 目錄中來實現對各種儲存軟體的支援。


其中,這個外掛又分為 reader 外掛,和 writer 外掛兩部分。


用DataX導資料到Clickhouse遇到的坑


只不過,並不是所有的外掛都需要你去開發,對於DataX來說,它原本就內建了一些比較常用的reader 外掛以及 writer 外掛,直接用就可以。



1. 編譯CK的writer外掛原始碼


由於本次我的需求是將讀取到的MySQL資料來源,給寫入到CK中,也就是說,在我的 DataX 裡,分別要有一個mysql的reader外掛,以及一個ck的writer外掛。


但是,對於從官網下載的原始版本的DataX來說,目前只有mysql的reader外掛,而沒有CK的writer外掛,咋整?


最好的辦法:下載原始碼,適當修改和編譯!


雖然在網上也能找到一些CK的writer外掛,但這裡我不建議,因為很有可能你下載的的外掛,是基於老版本的CK開發和編譯的,也許並不適用你的場景。


1.1 拉取程式碼


既然需要對原始碼做適當修改,第一步當然是要將它拉取到本地的IDE開發環境中。


具體的Git地址為:(最新的)


拉取到本地IDE之後,由於這個地址包含了所有目前 DataX 支援的 reader 和 writer 外掛 module (程式碼),所以內容就太多了,我們只需要選取本次需要的 CK writer 外掛以及相應的必須依賴就可以。


用DataX導資料到Clickhouse遇到的坑


所以,在我的IDE裡,會把這些我不需要的 modules 全都給註釋掉,整個專案就變成了這樣:


用DataX導資料到Clickhouse遇到的坑


1.2 修改對應配置


給這個DataX的外掛工程瘦身之後,接下就需要根據前面說的,根據實際CK的版本情況,對配置做適當的修改。


透過檢視原始碼的配置可以知道,DataX的CK外掛用的jdbc通訊方式,且對應的配置如下:


用DataX導資料到Clickhouse遇到的坑


我部署的CK為23.xx版本,屬於比較新的版本,官方推薦的jdbc版本依賴如下:


用DataX導資料到Clickhouse遇到的坑


所以很顯然,需要修改DataX外掛依賴的jdbc版本,跟CK官網要求的保持一致,否則會導致資料寫入報錯。


修改後,透過IDE對這個外掛工程進行編譯,編譯後,得到如下對應的檔案和相關目錄:


用DataX導資料到Clickhouse遇到的坑


1.3 第1個坑


將上述這個CK writer外掛(編譯後生成的外掛內容)上傳到dataX的plugin目錄下配合我這個配置檔案


{
    "job": {
        "setting": {
            "speed": {
                 "channel"3
            },
            "errorLimit": {
                "record"0,
                "percentage"0.02
            }
        },
        "content": [
            {
                "reader": {
                    "name""mysqlreader",
                    "parameter": {
                        "username""root",
                        "password""xxxx",
                        "column": ["id","name"],
                        "splitPk""id",
                        "connection": [
                            {
                                "table": ["test"],
                                "jdbcUrl": [
     "jdbc:mysql://mysql_ip:3306/clickhouse_test"
                                ]
                            }
                        ]
                    }
                },
               "writer": {
                    "name""clickhousewriter",
                    "parameter": {
                        "username""default",
                        "password""xxxx",
            "column":["id","name"],
            "connection": [
              {
                "jdbcUrl""jdbc:ch://ck_ip:8123/default",
                "table":["test01"]
              }
            ]
                    }
                }
            }
        ]
    }
}

根據模板修改的一個最簡單例子


啟動對應的資料傳輸命令:


用DataX導資料到Clickhouse遇到的坑

喜提第一個坑,說這個外掛目錄下有大量這種以._命名的隱藏檔案,然後程式把這個隱藏的檔案全部都當成目錄了,要去找裡面的plugin.json檔案。


解決辦法就是,刪除reader和writer目錄下所有以._命名的這些檔案。


怎麼說呢,這要不是腦子有幾個包,應該是想不出這麼個設計的。



1.4 第2個坑


以為把上面這個問題解決了就沒事了吧,但我還是想簡單了,再次啟動,就給我扔出這麼個破玩意:


用DataX導資料到Clickhouse遇到的坑


從報錯中可以明顯看出來,它載入了一個過時的CK的jdbc驅動類


但是我明明在原始碼的pom檔案中,已經給改過來為最新的了啊,為啥它還要去找這個老驅動類呢。


於是我找啊找,找啊找,終於,在CK的外掛原始碼中揪出了這個罪魁禍首。


用DataX導資料到Clickhouse遇到的坑


原來這個JDBC的驅動類,被硬編碼在common這個module的一個列舉類中。


找出來後,把它改為新版本的驅動類:


用DataX導資料到Clickhouse遇到的坑



好,編譯打包,再試一次。


1.5 第3個坑


再次執行,又報錯了。


用DataX導資料到Clickhouse遇到的坑


說當前CK外掛寫入資料庫時不支援LZ4這種壓縮方式,好吧,那我們就在依賴里加上它。


在DataX的開發環境,對應的 clickhousewriter 模組pom檔案裡,加上對應依賴。


用DataX導資料到Clickhouse遇到的坑



再次編譯,打包,更換掉之前的CK writer,再試。


用DataX導資料到Clickhouse遇到的坑


終於,它不報錯了。



最後


就這麼個小小的需求,結果踉踉蹌蹌硬是讓我摔了3個跟頭。


DataX給我的感覺呢,雖然是一款功能強大,但是做工粗糙的資料傳輸工具,深入使用你會發現,它裡面有很多設計不夠嚴謹,甚至很傻缺的地方。


老實說,如果不是萬不得已,比如叢集的軟體環境受限,開發人員水平不夠等客觀因素,我最信賴的資料傳輸工具還屬計算引擎,真正做到了功能強大+靈活好用。


只能說,希望它越來越好吧...

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027827/viewspace-2992468/,如需轉載,請註明出處,否則將追究法律責任。

相關文章