MySQL 到 ClickHouse 宽表构建
· 阅读需 7 分钟
简述
本文简要介绍 CloudCanal 如何支持 MySQL -> ClickHouse 的宽表构建。
技术 点
ClickHouse 表关联之觞
ClickHouse 作为标准的列存数据库,其特点相当鲜明,对于多维度数据聚合、筛选特别高效,对于列存面向计算的特点,用得相当不错,包括但不限于以下特点
- io 效率高
- 列压缩
- 少数列数据存取io放大效应较小
- 极致计算优化
- 向量化
- 利用 SSE 等 SIMD 指令集加速
- 未来可选 AVX 512 等指令集优化
- 未来对于计算卸载到 FPGA、GPU 较便利
但是 ClickHouse 对于数据关联(join), 相比于其 多维聚合、筛选 能力要弱一些。对于这个问题,我们觉得有必要通过 CloudCanal 的宽表能力,让其适用性得到进一步提升。大宽表 + 突出的数据 多维聚合、筛选 能力,几乎等于交互式分析的杀手锏。
操作示例
前置条件:
-
下载安装 CloudCanal 私有部署版本,使用参见快速上手文档
-
准备好 MySQL 数据库(本例使用 5.7 版本)和 ClickHouse 数据库(本例使用 21.8.X 版本)
-
MySQL 上创建 1 张事实表(my_order)和 2 张维表 (user 、product)
CREATE TABLE `my_order` (
`id` bigint(19) NOT NULL AUTO_INCREMENT,
`gmt_create` datetime NOT NULL,
`gmt_modified` datetime NOT NULL,
`product_id` bigint(20) NOT NULL,
`user_id` bigint(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1460 DEFAULT CHARSET=utf8;
CREATE TABLE `product` (
`id` bigint(19) NOT NULL AUTO_INCREMENT,
`gmt_create` datetime NOT NULL,
`gmt_modified` datetime NOT NULL,
`name` varchar(255) NOT NULL,
`price` decimal(20,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2719 DEFAULT CHARSET=utf8;
CREATE TABLE `user` (
`id` bigint(19) NOT NULL AUTO_INCREMENT,
`gmt_create` datetime NOT NULL,
`gmt_modified` datetime NOT NULL,
`name` varchar(255) NOT NULL,
`level` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2224 DEFAULT CHARSET=utf8 -
ClickHouse 上创建 1 张宽表 my_order , 并额外包含两张维表相关数据
- user_id (关联user.id), user_name(对应user.name)
- product_id( 关联product.id) ,product_name(对应product.name),product_price (对应product.price)
CREATE TABLE trade.my_order
(
`id` Int64,
`gmt_create` DateTime,
`gmt_modified` DateTime,
`product_id` Int64,
`user_id` Int64,
`user_name` Nullable(String),
`product_name` Nullable(String),
`product_price` Nullable(Decimal(20, 2))
)
ENGINE = ReplacingMergeTree
ORDER BY id
SETTINGS index_granularity = 8192
开发宽表代码
- 代码工程 cloudcanal-data-process ,并找到代码类 MySqlToChOnlyFact_one_fact_two_dim.java
- 修改必要信息

打包
- 进入工程目录,使用命令进行打包
% pwd
/Users/zylicfc/source/product/cloudcanal/cloudcanal-data-process
% mvn -Dtest -DfailIfNoTests=false -Dmaven.javadoc.skip=true -Dmaven.compile.fork=true clean package
自定义代码包
- 打包命令后,代码包位于工程目录下的 wide-table/target 目录

添加数据源
- 登录 CloudCanal 平台
- 数据源管理->新增数据源
- 将MySQL 和 ClickHouse 分别添加

任务创建
- 任务管理->任务创建
- 选择 源 和 目标 数据源
- 选择 数据同步,并勾选 全量数据初始化, 其他选项默认
- 选择需要迁移同步的表, 此处只要选择事实表即可,维表会通过自定义代码反查补充

- 选择列,默认全选,选择上传代码包(路径如上所示)

- 确认创建,并自动运行

校验数据
- 变更事实表数据

