用DataX導資料到Clickhouse遇到的坑
來源:安瑞哥是碼農
這兩天在幫一個專案部署 Clickhouse (下稱CK),並且需要將上游的資料給匯入到其中。
由於只是一個單純的上游資料匯入,暫時還不涉及到對資料的計算和處理,所以就想著用一個合適的資料匯入工具來滿足這個需求。
於是,我就想到了DataX(因為之前用過的CK外部表+物化檢視的方式突然在當前環境下啞火了)。
原本以為就是一個簡單的資料傳輸,用這個號稱功能強大的傳輸工具,應該手到擒來才對,但不曾想,這玩意的坑不少。
0. 下載和部署
由於第一次在文章中寫關於DataX的內容,先簡單聊下我對這個工具的認識。
DataX是一個以Python語言為外殼,Java語言為核心的多執行緒資料傳輸軟體,它的一大特點是,對資料來源的讀取,以及向資料目的地的寫入,是透過一個個「外掛」來實現的。
所以對於DataX來說,想要實現一個完整的資料傳輸功能,就必須包含兩大部分。
第一部分為DataX的軟體主體(DataX工具包):
這個是使用 DataX 的基礎,透過官方提供的下載地址,下載下來後是一個壓縮包。
解壓後,跟很多普通軟體一樣目錄結構是這樣的:
這部分包含了DataX的核心啟動程式,以及資料傳輸時需要依賴的基礎環境。
第二個為外掛部分:
這個外掛,可以根據你不同的資料儲存(比如各種資料庫,檔案系統等)的版本、特點來進行編碼(實現特定的介面),最後打包成DataX規範的目錄結構,然後將其上傳到對應的 plugin 目錄中來實現對各種儲存軟體的支援。
其中,這個外掛又分為 reader 外掛,和 writer 外掛兩部分。
只不過,並不是所有的外掛都需要你去開發,對於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 外掛以及相應的必須依賴就可以。
所以,在我的IDE裡,會把這些我不需要的 modules 全都給註釋掉,整個專案就變成了這樣:
1.2 修改對應配置
給這個DataX的外掛工程瘦身之後,接下就需要根據前面說的,根據實際CK的版本情況,對配置做適當的修改。
透過檢視原始碼的配置可以知道,DataX的CK外掛用的jdbc通訊方式,且對應的配置如下:
而我部署的CK為23.xx版本,屬於比較新的版本,官方推薦的jdbc版本依賴如下:
所以很顯然,需要修改DataX外掛依賴的jdbc版本,跟CK官網要求的保持一致,否則會導致資料寫入報錯。
修改後,透過IDE對這個外掛工程進行編譯,編譯後,得到如下對應的檔案和相關目錄:
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"]
}
]
}
}
}
]
}
}
根據模板修改的一個最簡單例子
啟動對應的資料傳輸命令:
喜提第一個坑,說這個外掛目錄下有大量這種以._命名的隱藏檔案,然後程式把這個隱藏的檔案全部都當成目錄了,要去找裡面的plugin.json檔案。
解決辦法就是,刪除reader和writer目錄下所有以._命名的這些檔案。
怎麼說呢,這要不是腦子有幾個包,應該是想不出這麼個設計的。
1.4 第2個坑
以為把上面這個問題解決了就沒事了吧,但我還是想簡單了,再次啟動,就給我扔出這麼個破玩意:
從報錯中可以明顯看出來,它載入了一個過時的CK的jdbc驅動類。
但是我明明在原始碼的pom檔案中,已經給改過來為最新的了啊,為啥它還要去找這個老驅動類呢。
於是我找啊找,找啊找,終於,在CK的外掛原始碼中揪出了這個罪魁禍首。
原來這個JDBC的驅動類,被硬編碼在common這個module的一個列舉類中。
找出來後,把它改為新版本的驅動類:
好,編譯打包,再試一次。
1.5 第3個坑
再次執行,又報錯了。
說當前CK外掛寫入資料庫時不支援LZ4這種壓縮方式,好吧,那我們就在依賴里加上它。
在DataX的開發環境,對應的 clickhousewriter 模組pom檔案裡,加上對應依賴。
再次編譯,打包,更換掉之前的CK writer,再試。
終於,它不報錯了。
最後
就這麼個小小的需求,結果踉踉蹌蹌硬是讓我摔了3個跟頭。
DataX給我的感覺呢,雖然是一款功能強大,但是做工粗糙的資料傳輸工具,深入使用你會發現,它裡面有很多設計不夠嚴謹,甚至很傻缺的地方。
老實說,如果不是萬不得已,比如叢集的軟體環境受限,開發人員水平不夠等客觀因素,我最信賴的資料傳輸工具還屬計算引擎,真正做到了功能強大+靈活好用。
只能說,希望它越來越好吧...
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027827/viewspace-2992468/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用dataX遇到的坑
- Sqoop匯出ClickHouse資料到HiveOOPHive
- Flink同步Kafka資料到ClickHouse分散式表Kafka分散式
- waterdrop匯出hdfs資料到clickhouse(text,csv,json)JSON
- excel導資料到PostgresqlExcelSQL
- 使用DataX同步MaxCompute資料到TableStore(原OTS)最佳化指南
- 基於DataX的資料同步(下)-應用DataX進行資料同步
- Blazor Hybrid 實戰體驗:那些你可能沒預料到的坑沒預料到的坑Blazor
- Oracle資料庫中遇到的坑Oracle資料庫
- Clickhouse的MySQL外部表,坑貨!MySql
- 【eclipse遇到的坑】Eclipse
- NSString 遇到的坑
- mpvue遇到的坑Vue
- RSA加密遇到的坑加密
- Laravel Excel 遇到的坑LaravelExcel
- 小程式 遇到的坑
- springboot整合swagger遇到的坑Spring BootSwagger
- webpack 4 配置遇到的坑Web
- libwebsocket demo以及遇到的坑。Web
- springboot引入mybatis遇到的坑Spring BootMyBatis
- 基於DataX的資料同步(上)-DataX介紹以及安裝
- 資料同步Datax與Datax_web的部署以及使用說明Web
- 大資料到底是幹什麼用的?大資料
- Vue專案部署遇到的坑(你肯定會遇到!)Vue
- NPM 安裝包遇到的坑!NPM
- 小程式使用Picker遇到的坑
- PHP date() 函式遇到的坑PHP函式
- ffmpeg軟解碼遇到的坑
- 使用constexpr時遇到的小坑
- 使用laravels可能遇到的小小坑Laravel
- Python使用ClickHouse的實踐與踩坑記錄Python
- vue中$set的使用(結合在實際應用中遇到的坑)Vue
- 記錄一次用 ThinkPHP 小程式登陸遇到的坑PHP
- django儲存資料到表時,遇到字符集問題--已解決Django
- 刪除外部表時遇到的坑
- 關於jqGrid+mybatisplus遇到的坑MyBatis
- 遇到 MySQL 8.0.11 的一些坑MySql
- Laravel 使用 swoole 協程遇到的坑Laravel