浅析mysql迁移到clickhouse的5种方法

作者:安家 时间:2024-01-27 21:51:47 

数据迁移需要从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', 'user', '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', 'db', 'article_clientuser_sum', 'user', 'password')

网友文章: http://jackpgao.github.io/2018/02/04/ClickHouse-Use-MySQL-Data/

不支持自定义列,参考资料里的博主写的 ENGIN=MergeTree 测试失败。

可以理解成 create tableinsert 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的5种方法

启用并重启服务

浅析mysql迁移到clickhouse的5种方法

上传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目录下

浅析mysql迁移到clickhouse的5种方法

然后拷贝到 streamsets /opt/streamsets-datacollector-3.9.1/streamsets-libs-extras/streamsets-datacollector-jdbc-lib/lib/ 目录下

浅析mysql迁移到clickhouse的5种方法

重启streamsets服务

浅析mysql迁移到clickhouse的5种方法 浅析mysql迁移到clickhouse的5种方法 浅析mysql迁移到clickhouse的5种方法 浅析mysql迁移到clickhouse的5种方法浅析mysql迁移到clickhouse的5种方法 浅析mysql迁移到clickhouse的5种方法

总结

以上所述是小编给大家介绍的mysql迁移到clickhouse的5种方法,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:https://anjia0532.github.io/2019/07/17/mysql-to-clickhouse/

标签:mysql,迁移,clickhouse
0
投稿

猜你喜欢

  • 用python 批量更改图像尺寸到统一大小的方法

    2021-04-04 23:47:42
  • MyCat环境搭建详细教程

    2024-01-25 01:16:15
  • 连续字符自动换行的解决方案

    2008-12-04 16:39:00
  • python导出chrome书签到markdown文件的实例代码

    2022-08-26 00:49:36
  • 浅谈keras中的batch_dot,dot方法和TensorFlow的matmul

    2023-04-08 07:21:28
  • python可视化大屏库big_screen示例详解

    2021-10-16 14:32:39
  • Python 实现自动完成A4标签排版打印功能

    2021-07-14 22:55:15
  • Python打开文件,将list、numpy数组内容写入txt文件中的方法

    2023-12-16 21:23:17
  • tensorflow之如何使用GPU而不是CPU问题

    2023-07-06 13:05:48
  • python实现查找excel里某一列重复数据并且剔除后打印的方法

    2021-01-23 10:27:45
  • python global和nonlocal用法解析

    2022-05-17 02:56:17
  • Python之用户输入的实例

    2022-09-06 13:22:18
  • php中常量DIRECTORY_SEPARATOR用法深入分析

    2023-09-06 00:23:27
  • mysql 计算函数详情

    2024-01-14 05:19:09
  • vue修改滚动条样式的方法

    2024-04-27 15:48:59
  • Python写的一个简单DNS服务器实例

    2021-03-25 21:13:47
  • Python实现基于socket的udp传输与接收功能详解

    2023-09-04 03:23:20
  • 基于python元祖与字典与集合的粗浅认识

    2023-11-11 07:19:48
  • git 报错:OpenSSL SSL_read: Connection was reset, errno 10054 解决方法

    2022-12-23 11:55:00
  • Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)

    2024-05-03 15:13:30
  • asp之家 网络编程 m.aspxhome.com