数据知行合一
知:掌握数据建设方法论、技术体系;
行:将数据建设方法论、技术体系与业务场景结合落地
关注“数据万有引力”公众号
正文共:3198字 11图 | 预计阅读时间:8分钟
承接上个专题 clickhosue准实时数仓能力探索 留下问题“上游实时数据怎么sink到clickhouse?”,在这里一起探索 CDC ChangeLog Stream实时流sink 到CLICKHOUSE最佳姿势。
在进行技术选型、方案设计与实操之前,先简单概述下数据库变更日志是怎么流入click house的:
CDC技术通过实时捕捉数据变更日志作为流计算引擎(如flink,spark)
数据源,这些实时流数据源ChangeLog Stream由包含变更操作列(用于插入、删除、更新(先前)、更新(新)标识)的行和实际的元数据列组成,流入flink引擎。flink再将ChangeLog Stream转换为Dynamic Table的Append或Retract或Upsert模式,然后再sink到外部系统,如:clickhouse
这里涉及到几个术语解释:
Dynamic table在flink中是一个逻辑概念,。下图是ChangeLog Stream和dynamic table转换关系,先将ChangeLog Stream转化为dynamic table,再基于dynamic table进行SQL操作生成新的dynamic table。
上游CDC技术,实时捕捉数据库变更日志,flink实时消费日志,数据库中的变更日志作为flink流的数据源(Changelog Stream),如 MySQL 的 binlog 日志完整记录了数据库中的变更,可以把 binlog 文件当作流的数据源
在将Changelog Stream转换为Dynamic Table或将其写入外部系统时,Flink 根据数据变化类型提供三种结果的输出模式。
Append-only stream:A dynamic table that is only modified by INSERT changes can be converted into a stream by emitting the inserted rows. flink-docs-release-1.15
Append-only 是最为简单的输出模式,只支持追加结果记录的操作。结果一旦输出以后便不会再有变更,Append 输出模式的最大特性是不可变性(immutability)
通常来说,Append 模式会用于写入不方便做撤回或者删除操作的存储系统的场景,比如 Kafka 等 MQ 或者打印到控制台。
Retract stream: A retract stream is a stream with two types of messages, add and retract messages. A dynamic table is converted into a retract stream by encoding an INSERT change as add message, a DELETE change as a retract message, and an UPDATE change as a retract message for the updated (previous) row, and an additional message for the updating (new) row. flink-docs-release-1.15
retract 流包含两种类型的 message:add messages 和 retract messages 。通过将INSERT 操作编码为 add message、将 DELETE 操作编码为 retract message、将 UPDATE 操作编码为更新(先前)行的 retract message 和更新(新)行的 add message,将动态表转换为 retract 流。
如上图,在mysql执行update操作
update inventory.`debezium_products` set weight=180 where id=101;
ChangeLog转为Retract stream会在dynamic table写入以下数据
op | id | name | description | weight |
---|---|---|---|---|
-U | 101 | scooter | description | 80.000 |
+U | 101 | scooter | description | 180.000 |
Upsert stream: An upsert stream is a stream with two types of messages, upsert messages and delete messages. A dynamic table that is converted into an upsert stream requires a (possibly composite) unique key. flink-docs-release-1.15
upsert 流包含两种类型的 message:upsert messages 和_delete messages_。转换为 upsert 流的动态表需要(可能是组合的)唯一键。通过将 INSERT 和 UPDATE 操作编码为 upsert message,将 DELETE 操作编码为 delete message 。
如上图,在mysql执行update操作
update inventory.`debezium_products` set weight=180 where id=101;
ChangeLog转为Retract stream会在dynamic table写入以下数据
op | id | name | description | weight |
---|---|---|---|---|
-D | 101 | scooter | description | 80.000 |
+I | 101 | scooter | description | 180.000 |
由于clickhosue以下特性,ChangeLog Stream 写入clickhosue需要相应解决方案
通过以下方案,解决ChangeLog Stream 写入clickhosue存在以上局限问题
基于以上解决方案,flink-connector-clickhouse设计如下图 ,
扫下面二维码或搜一搜“数据万有引力”关注公众号获取 “flink-connector-clickhouse.jar”,私信获取源码
在flink cdc connector与flink Debezium Format对CDC技术进行选型,通过上图架构与对比
虽然flink cdc 有很多亮点能力,不过项目还在孵化阶段,有些操作不是很丝滑;如果有功力深厚的技术架构团队来驾驭它(陪社区一起成长,拥抱社区并与之合作),flink cdc 可以覆盖业务场景会更深。
如果业务场景对稳定要求比较高,同时又不想投入高成本驾驭技术,其实Debezium已经可以覆盖很多场景了。
可以将Debezium作为Flink的嵌入式引擎,作为一个依赖包嵌入到代码库,而不用通过kafka connector运行,同样也可以不再需要直接与 MySQL 服务器通信,不需要处理复杂快照、GTID、锁等等优点。同时简化
根据上面探索,最终CDC ChangeLog Stream实时流sink 到CLICKHOUSE全过程解决方案如上图
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。