Flink cdc3.0动态变更表结构——源码解析

前言

上一篇Flink cdc3.0同步实例 介绍了最新的一些功能和问题,本篇来看下新功能之一的动态变更表结构的具体实现。
在 Flink 中,应用程序由流数据流组成,这些数据流是由用户定义的Operators进行转换。
在这里插入图片描述
Flink CDC 3.0 框架中流动的数据类型被称为Event,代表外部系统产生的变更事件。每个事件都标有发生更改的表 ID 。事件分为SchemaChangeEventDataChangeEvent,分别代表表结构和数据的变化。处理schema变更的Operators对应图中的SchemaOperator
在这里插入图片描述
(以下代码使用Flink Release 3.0.0)

源码解析

1. 接收schema变更事件

我们以添加字段触发的AddColumnEvent为例,它实现了SchemaChangeEventSchemaOperator 当接收到有AddColumnEvent 事件时,会在processElement 中调用handleSchemaChangeEvent处理。
在这里插入图片描述

2. 发起schema变更请求

说明下这里的response实际是直接返回的new SchemaChangeResponse(true), 由于构造的shouldSendFlushEvent 直接传入true, 所以后续也会进入if条件。我们接着requestSchemaChange 方法看
在这里插入图片描述
由于知道response是直接创建的已知结果,因此responseFuture.get() 也不会阻塞。我们接着来看toCoordinator.sendRequestToCoordinator(getOperatorID(), new SerializedValue<>(request));的实现
在这里插入图片描述

3. schema变更请求具体处理

通过几层的调用,上述变更请求会走到 SchemaRegistryhandleCoordinationRequest(CoordinationRequest request),我们的请求是SchemaChangeRequest,所以会调用requestHandler.handleSchemaChangeRequest(schemaChangeRequest);
在这里插入图片描述
这里可以看到response 是直接创建的SchemaChangeResponse(true)。 接着schemaManager.applySchemaChange(request.getSchemaChangeEvent());注册新的schema。

在这里插入图片描述
另外还有个重点,在startToWaitForReleaseRequest方法中会重置responseFuture, 原本的response通过return返回了。而PendingSchemaChange中的response重置,主要就是为了等schema变更完成设计。(主线程会再次发起请求调用responseFuture.get() ,忽略这里会不理解后面为什么会阻塞)
在这里插入图片描述

4. 广播刷新事件并阻塞

回到第二部分,因为response是一个明确对象没有阻塞,返回后会直接广播FlushEventschemaChangeEvent(再次发起schemaChangeEvent不是很理解)。之后requestReleaseUpstream 请求调用responseFuture.get()会阻塞,因为response在第三步已经重置为new CompletableFuture<>(), 利用的1.8的特性。这也是收到变更事件后要保证sink端变更才能发放数据。
在这里插入图片描述

5. 处理FlushEvent

FlushEvent 由什么Operator处理,在官方架构图中其实没有指出,但是图标可以看出是通过sink端完成,我们可以找到DataSinkWriterOperator类,有对FlushEvent的处理。
在这里插入图片描述
实际调用SchemaRegistry::handleEventFromOperator方法,重点在requestHandler.flushSuccess(flushSuccessEvent.getTableId(), flushSuccessEvent.getSubtask());
在这里插入图片描述
其中applySchemaChange 就是在具体的sink端变更,下面会展开。 当变更完成后会执行waitFlushSuccess.getResponseFuture().complete(wrap(new ReleaseUpstreamResponse()));,实际就通知第4部分的response这里处理完了,可以正常放开数据流。
在这里插入图片描述

6. 修改sink端schema

每个sink端有自定义的metadataApplier
在这里插入图片描述
我们以DorisMetadataApplier为例,applyAddColumnEvent 会构造addFieldSchema,然后在schemaChangeManager 中转换为对应的sql执行。
在这里插入图片描述

结尾

以上就是这两天对源码跟进的记录,后续思考使用local环境Debug中间过程。
flink cdc debug动态表结构变更

### 配置和使用 Flink CDC 3.0 与 RDS 数据源 #### 关于 Flink CDC 版本演进 Flink CDC 的发展经历了多个版本,在早期版本中,为了确保数据的一致性,默认情况下会采用全局锁机制来处理变更数据捕获过程中的事务隔离问题[^1]。然而这种做法可能会带来性能上的瓶颈以及潜在的应用hang住风险。随着技术的进步,Flink CDC 2.0引入了新的设计思路,特别是针对MySQL这类关系型数据库的支持进行了优化改进[^2]。 对于最新版即Flink CDC 3.0而言,其进一步增强了对多种主流云服务提供商所托管的关系型数据库(如AWS RDS)的支持能力,并且通过一系列技术创新实现了更高效稳定的数据同步体验。 #### 如何配置 Flink CDC 3.0 和 AWS RDS MySQL 实例连接 要实现这一目标,需遵循如下指南: - **环境准备** - 确认已安装并配置好 Apache Flink 环境。 - 下载适用于特定版本的 `flink-sql-connector` JAR 文件,可以从官方GitHub仓库获取对应版本资源文件[^3]。 - **创建 Debezium Connector JSON 配置** ```json { "name": "rds-mysql-source", "config": { "connector.class": "io.debezium.connector.mysql.MySqlConnector", "database.hostname": "<your-rds-endpoint>", "database.port": "3306", "database.user": "<db-user>", "database.password": "<db-password>", "database.server.id": "184054", "database.include.list": "<target-database-name>", "table.whitelist": "<schema>.<tablename>", "database.history.kafka.bootstrap.servers": "localhost:9092", "database.history.kafka.topic": "history-topic" } } ``` 请注意替换 `<...>` 占位符为实际参数值。 - **启动 Flink SQL Client 并加载必要的依赖库** ```bash ./bin/sql-client.sh embedded -j /path/to/flink-sql-connector-flink-cdc-x.x.x.jar ``` 这里 `/path/to/` 应指向下载好的JAR包路径;而 `-j` 参数用于指定外部插件的位置。 - **定义输入表结构并通过 DDL 创建逻辑视图** ```sql CREATE TABLE rds_mysql_table ( id BIGINT, name STRING, age INT, ts TIMESTAMP(3), WATERMARK FOR ts AS ts - INTERVAL &#39;5&#39; SECOND ) WITH ( &#39;connector&#39; = &#39;mysql-cdc&#39;, &#39;hostname&#39; = &#39;<your-rds-endpoint>&#39;, &#39;port&#39; = &#39;3306&#39;, &#39;username&#39; = &#39;<db-user>&#39;, &#39;password&#39; = &#39;<db-password>&#39;, &#39;database-name&#39; = &#39;<target-database-name>&#39;, &#39;table-name&#39; = &#39;<schema>.<tablename>&#39; ); ``` 以上SQL语句展示了如何基于之前设置好的Debezium connector配置信息构建一个名为 `rds_mysql_table` 的虚拟表格对象,它可以直接参与到后续ETL流程当中去。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值