背景
公司採購了外部服務,其儲存為ClickHouse,按照公司要求需要將其資料採集到Hive。
驗證環境
- CDH: 6.3.2
- ClickHouse: 19.15.4.10
- Sqoop: 1.4.7
Driver
- 需要在指令碼中明確指明所使用的Driver完整簽名。
- ClickHouse使用自定義協議,所以需要將jar檔案新增到$SQOOP_HOME/lib(僅提交任務到客戶端機器即可)。
- 0.4.0版本:
$SQOOP_HOME/lib/clickhouse-jdbc-0.4.0-all.jar
- 0.3.1-patch:
$SQOOP_HOME/lib/clickhouse-jdbc-0.3.1-patch-shaded.jar
- 0.4.0版本:
異常
No columns to generate for ClassWriter
這是一個通用異常,表示在生成程式碼之前發生了異常。想要解決問題,需要檢視該異常之前的異常,有時不能正確顯示異常,如果看不懂,再次執行顯示異常可能會變化,曝露出來的才是真問題,比如使用者名稱密碼問題,或者driver版本問題。
- 使用者名稱密碼問題,如果ck端沒有使用者名稱密碼,則不要新增username和password。
- driver版本問題,筆者driver使用0.4.0.0,ck server端使用19.15.4.10,提示"Sorry this driver only supports Clickhouse server 20.7 or above,降至0.3.1-patch版本問題解決。
注意
clickhouse-jdbc-0.3.2+(包含0.3.2)版本與之前版本有較大差異,請根據自己的ClickHouse server版本選擇對應版本。
- 0.3.2+僅支援ClickHouse server 20.7,本次驗證使用0.3.1-patch版本可以實現sqoop import。
- driverClass名稱在0.3.2版本同樣發生了變更:
- 0.3.2(含)+:
com.clickhouse.jdbc.ClickHouseDriver
- 0.3.2(不含)-:
ru.yandex.clickhouse.ClickHouseDriver
- 協議名稱也發生了調整
- 0.3.2(含)+:
jdbc:ch://<host>:<port>[/<database>]
- 0.3.2(不含)-:
jdbc:clickhouse://<host>:<port>[/<database>]
指令碼
如下指令碼用於0.3.1-patch版本,在0.3.2+版本注意修改driver和協議名稱。
sqoop import \
--connect "jdbc:clickhouse://10.1.10.18:8124/mydb" \
--driver ru.yandex.clickhouse.ClickHouseDriver \
-m 1 \
--mapreduce-job-name mydb_message \
--hs2-url "jdbc:hive2://hadoop7:10001/;principal=hive/hadoop7@N18.COM" --hive-table dev_shuju.mydb_message \
--target-dir /tmp/sqoop/import/mydb_message \
--delete-target-dir \
--hive-import \
--hive-drop-import-delims \
--hive-overwrite \
--fields-terminated-by '\001' \
--null-string '\\N' \
--null-non-string '\\N' \
--hive-partition-key ymd \
--hive-partition-value '20211127' \
--query "select * from message where date='2021-11-27' and \$CONDITIONS";
效能
條數 | 位元組數 | 並行度 | 用時 | 速率 | 網路環境 |
---|---|---|---|---|---|
410 萬 | 5.35GB | 1 | 290 sec | 18.85 MB/sec | 千兆區域網 |