对于一些还没有完成数仓建设的新业务,或是刚刚开始依托 StarRocks 进行 OLAP 平台建设的用户而言,在 StarRocks 中建表以承载 Mysql 同步过来的数据是第一步。在一些复杂的业务中,Mysql 中的表往往有几十上百张,每张表又有数十个字段,要把它们对应的 StarRocks 表的建表语句全部编写出来是一个很大的工作量。第一个痛点 StarRocks 建表的工作量大。
在 StarRocks 中建表是第一步,建表完成之后,为了启动 CDC 任务,还需要在 Flink 中建立 Mysql 对应的 Source 表,以及 StarRocks 对应的 Sink 表,其中 Flink 建表时,每个字段的字段类型与 Mysql、与 StarRocks 的映射关系需要严格注意,对于动辄几十上百个需要字段的表,每个字段都需要查找对应在 Flink 的类型映射关系,尤其令开发人员痛苦。因此,第二个痛点是上下游表与 Flink 字段的数据类型映射关系复杂,容易出错。
第三个痛点来自于业务数据 Schema 的变化,据 Fivetran 公司调查,约有 60% 的公司数据 Schema 每个月都会发生变化,30% 的公司数据 Schema 每周都会发生变化。对于 Mysql 表中字段的增删改,用户希望在不影响 CDC 任务的情况下,将 Schema 变化同步到下游的 StarRocks。目前常用的方案,是在手动停止任务后,更改 StarRocks 和 Mysql 的 Schema,更改 Flink 侧的 Sink 和 Source 表结构,通过指定 savepoints 的方式再次启动任务。Schema 变更的操作繁琐,无法自动化是第三个痛点。
第四个痛点,是在表的数量多、实时增量数据量大的场景下,CDC 任务占用的内存和 cpu 资源较高,出于节省成本的考虑,用户希望尽可能的在资源利用方面进行优化。
接下来,我们来看针对这些痛点,EMR-StarRocks 在与 Flink 深度结合方面做了哪些优化,提供了什么样的解决方案。
EMR-StarRocks 与 Flink 团队推出的 CTAS&CDAS 功能主要是针对前三个痛点研发的一个解决方案。通过 CTAS&CDAS,可以使用一条 SQL 语句,完成 StarRocks 建表、Flink-CDC 任务创建、实时同步 Schema 变更等原本需要多项繁杂操作的任务,令开发和运维的工作量大大降低。
CTAS 的全称是 create table as,语法结构如下:
CREATE TABLE IF NOT EXISTS runoob_tbl1 with (
'starrocks.create.table.properties'=' engine = olap primary key(runoob_id) distributed by hash(runoob_id ) buckets 8',
'database-name'='test_cdc',
'jdbc-url'='jdbc:mysql://172.16.**.**:9030',
'load-url'='172.16.**.**:8030',
'table-name'='runoob_tbl_sr',
'username'='test',
'password' = '123456',
'sink.buffer-flush.interval-ms' = '5000'
)
as table mysql.test_cdc.runoob_tbl /*+ OPTIONS ( 'connector' = 'mysql-cdc',
'hostname' = 'rm-2zepd6e20u3od****.mysql.rds.aliyuncs.com',
'port' = '3306',
'username' = 'test',
'password' = '123456',
'database-name' = 'test_cdc',
'table-name' = 'runoob_tbl' )*/;
通过 CTAS 的语法结构可以看到,除了集群信息和 DataBase 信息外,还有一个特殊配置 “starrocks.create.table.properties”,这是由于 Mysql 与 StarRocks 的表结构有一些不同,如 Key Type、分区、Bucket Number 等特殊配置,因此用它来承接 StarRocks 建表语句中字段定义后面的内容。
为了方便用户更快的建表,还设置了一个 Simple Mode,配置方式如下:
CREATE TABLE IF NOT EXISTS runoob_tbl1 with (
'starrocks.create.table.properties'=' buckets 8',
'starrocks.create.table.mode'='simple',
'database-name'='test_cdc',
'jdbc-url'='jdbc:mysql://172.16.**.**:9030',
'load-url'='172.16.**.**:8030',
'table-name'='runoob_tbl_sr',
'username'='test',
'password' = '123456',
'sink.buffer-flush.interval-ms' = '5000'
)
as table mysql.test_cdc.runoob_tbl /*+ OPTIONS ( 'connector' = 'mysql-cdc',
'hostname' = 'rm-2zepd6e20u3od****.mysql.rds.aliyuncs.com',
'port' = '3306',
'username' = 'test',
'password' = '123456',
'database-name' = 'test_cdc',
'table-name' = 'runoob_tbl' )*/;
开启 Simple Mode 之后,将默认使用 Primary Key 模型,默认使用 Mysql 中的主键作为 Primary Key,默认使用哈希 (主键) 进行分桶,这样,用户在启动 Simple Mode 对表使用 CTAS 语句时,就完全不需要关心 Mysql 中原表有哪些字段,字段名称是什么,主键是什么,只需要知道表名,就可以高效的完成 SQL 编写。