Apache Flink 架构与 CDC 图解

Apache Flink 是一个为无界和有界数据流提供数据驱动、有状态计算的框架和分布式处理引擎。它的架构遵循主从模式(Master-Slave)。

1. Flink 运行时架构 (Runtime Architecture)

客户端 (Client)
用户编写代码,通过命令行或 Web UI 提交作业。

执行流程说明:

  1. 提交作业: 客户端将用户代码编译成一个逻辑数据流图(JobGraph),并提交给 JobManager 中的 Dispatcher。
  2. 启动 JobMaster: Dispatcher 收到作业后,为该作业启动一个 JobMaster 进程。
  3. 请求资源: JobMaster 向 ResourceManager 请求执行作业所需的资源(即 TaskSlots)。
  4. 分配资源: ResourceManager 从已注册的 TaskManager 中分配可用的 TaskSlots 给 JobMaster。
  5. 部署任务: JobMaster 将 JobGraph 转化为物理执行图(ExecutionGraph),并将具体的计算任务(Tasks)部署到分配到的 TaskSlots 上。
  6. 执行与报告: TaskManager 上的任务开始执行数据处理。它们会向 JobMaster 汇报心跳和任务状态,JobMaster 同时协调检查点(Checkpoint)以保证容错性。

2. Flink 作业数据流 (Job Dataflow)

在一个 Flink 程序中,数据从一个或多个源开始,经过一系列转换操作,最后被发送到一个或多个目的地(Sink)。这种结构形成了一个有向无环图(DAG)。

数据源 (Source)
如 Kafka, 文件系统
转换 (Map)
一对一转换
转换 (KeyBy)
按 Key 分区
转换 (Window)
时间窗口聚合
数据汇 (Sink)
如数据库, Kafka

3. 什么是变更数据捕获 (CDC)?

变更数据捕获(Change Data Capture, CDC)是一种设计模式,用于确定和跟踪数据发生的变化,以便后续可以对这些变化做出响应。在 Flink 的场景下,Flink CDC 连接器能够以极低的延迟从 MySQL、PostgreSQL、MongoDB 等数据库中捕获行级别的变更,并将它们作为数据流进行处理。这种方式避免了传统的双重写入或轮询查询数据库带来的开销和延迟。

源数据库
1. 数据变更
应用执行 INSERT, UPDATE, DELETE 操作。
事务日志
(Binlog)
2. 记录日志
数据库将变更写入其事务日志中。
3. 捕获变更
Flink CDC 连接器读取日志,将变更转化为事件流。
下游系统
4. 数据同步
Flink 处理后写入数据仓库、搜索引擎或缓存。