淺析mysql遷移到clickhouse的5種方法
資料遷移需要從mysql匯入clickhouse,總結方案如下,包括clickhouse自身支援的三種方式,第三方工具兩種。
create table engin mysql CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],... INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2 ) ENGINE = MySQL('host:port','database','table','user','password'[,replace_query,'on_duplicate_clause']);
官方文件: https://clickhouse.yandex/docs/en/operations/table_engines/mysql/
注意,實際資料儲存在遠端mysql資料庫中,可以理解成外表。
可以通過在mysql增刪資料進行驗證。
insert into select from -- 先建表 CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],... ) ENGINE = engine -- 匯入資料 INSERT INTO [db.]table [(c1,c2,c3)] select 列或者* from mysql('host:port','db','table_name','password')
可以自定義列型別,列數,使用clickhouse函式對資料進行處理,比如
select toDate(xx) from mysql("host:port","db","table_name","user_name","password") create table as select from CREATE TABLE [IF NOT EXISTS] [db.]table_name ENGINE =Log AS SELECT * FROM mysql('host:port','article_clientuser_sum','password')
網友文章: http://jackpgao.github.io/2018/02/04/ClickHouse-Use-MySQL-Data/
不支援自定義列,參考資料裡的博主寫的 ENGIN=MergeTree
測試失敗。
可以理解成 create table
和 insert into select
的組合
Altinity/clickhouse-mysql-data-reader
Altinity公司開源的一個python工具,用來從mysql遷移資料到clickhouse(支援binlog增量更新和全量匯入),但是官方readme和程式碼脫節,根據quick start跑不通。
## 建立表 clickhouse-mysql \ --src-host=127.0.0.1 \ --src-user=reader \ --src-password=Qwerty1# \ --table-templates-with-create-database \ --src-table=airline.ontime > create_clickhouse_table_template.sql ## 修改指令碼 vim create_clickhouse_table_template.sql ## 匯入建表 clickhouse-client -mn < create_clickhouse_table_template.sql ## 資料匯入 clickhouse-mysql \ --src-host=127.0.0.1 \ --src-user=reader \ --src-password=Qwerty1# \ --table-migrate \ --dst-host=127.0.0.1 \ --dst-table=logunified \ --csvpool
官方文件: https://github.com/Altinity/clickhouse-mysql-data-reader#mysql-migration-case-1—migrate-existing-data
注意,上述三種都是從mysql匯入clickhouse,如果資料量大,對於mysql壓力還是挺大的。下面介紹兩種離線方式(streamsets支援實時,也支援離線)
csv
## 忽略建表 clickhouse-client \ -h host \ --query="INSERT INTO [db].table FORMAT CSV" < test.csv
但是如果源資料質量不高,往往會有問題,比如包含特殊字元(分隔符,轉義符),或者換行。被坑的很慘。
自定義分隔符,--format_csv_delimiter="|" 遇到錯誤跳過而不中止, --input_format_allow_errors_num=10 最多允許10行錯誤,--input_format_allow_errors_ratio=0.1 允許10%的錯誤 csv 跳過空值(null) ,報 Code: 27. DB::Exception: Cannot parse input: expected,before: xxxx: (at row 69) ERROR: garbage after Nullable(Date): "8,002<LINE FEED>0205" sed ' :a;s/,/,\\N,/g;ta' |clickhouse-client -h host --query "INSERT INTO [db].table FORMAT CSV" 將,替換成,\N,python clean_csv.py --src=src.csv --dest=dest.csv --chunksize=50000 --cols --encoding=utf-8 --delimiter=,
clean_csv.py參考我另外一篇032-csv檔案容錯處理
streamsets
streamsets支援從mysql或者讀csv全量匯入,也支援訂閱binlog增量插入,參考我另外一篇 025-大資料ETL工具之StreamSets安裝及訂閱mysql binlog 。
本文只展示從mysql全量匯入clickhouse
本文假設你已經搭建起streamsets服務
啟用並重啟服務
上傳mysql和clickhouse的jdbc jar和依賴包
便捷方式,建立pom.xml,使用maven統一下載
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.anjia</groupId> <artifactId>demo</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>demo</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>ru.yandex.clickhouse</groupId> <artifactId>clickhouse-jdbc</artifactId> <version>0.1.54</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> </dependencies> </project>
如果本地裝有maven,執行如下命令
mvn dependency:copy-dependencies -DoutputDirectory=lib -DincludeScope=compile
所有需要的jar會下載並複製到lib目錄下
然後拷貝到 streamsets /opt/streamsets-datacollector-3.9.1/streamsets-libs-extras/streamsets-datacollector-jdbc-lib/lib/
目錄下
重啟streamsets服務
總結
以上所述是小編給大家介紹的mysql遷移到clickhouse的5種方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!