Apache Flink 是一个分布式的流处理引擎,其架构设计遵循 Master-Slave 模式。要深入理解 Flink 的架构,可以从核心组件栈(分层架构)和运行时核心角色两个维度来剖析。
一、 Flink 的核心组件栈
从宏观的软件体系来看,Flink 的架构自下而上分为三层:
- 物理部署层(Deploy):负责底层资源的调度与管理。Flink 能够适应多种集群环境,支持本地单机(Local)、独立集群(Standalone),以及集成 Hadoop YARN、Kubernetes 等主流资源管理框架。
- Runtime 核心层(执行引擎):这是 Flink 分布式计算的心脏。它负责将上层的逻辑作业转换为 DAG(有向无环图)执行计划,进行任务调度、数据分发、状态管理以及容错恢复(Checkpoint)。
- API & Libraries 层:面向用户,提供丰富的编程接口。除了核心的 DataStream API(用于流计算)和 Table/SQL API 外,还衍生出了针对特定场景的库,如 Flink CEP(复杂事件处理)、Flink ML(机器学习)和 Gelly(图计算)等。
二、 运行时三大核心角色
在 Flink 的实际运行过程中,系统主要由 Client、JobManager 和 TaskManager 三个关键进程组成:
1. Client(客户端):作业的提交者
Client 是用户与 Flink 集群交互的桥梁。它的主要职责是将用户编写的代码(如 Java/Scala 程序)解析并打包成 JobGraph(逻辑执行计划),然后将其发送给 JobManager。需要注意的是,Client 并不参与作业的实际运行过程,提交完任务后即可断开连接或仅保持状态监控。
2. JobManager(作业管理器):集群的大脑
JobManager 是 Flink 的主控节点(Master),负责整个集群的任务调度和协调工作。它内部由三个重要组件构成:
- Dispatcher(分发器):接收 Client 提交的 JobGraph,并为每个作业启动一个专属的 JobMaster;同时提供 REST 接口和 Web UI 供用户查看作业状态。
- ResourceManager(资源管理器):负责集群中计算资源(Task Slot)的申请、分配与回收。它会与底层的部署环境(如 YARN/K8s)交互,动态扩缩容节点。
- JobMaster(作业主节点) :专门负责管理单个作业的生命周期。它将 JobGraph 转换为物理层面的 ExecutionGraph,向 ResourceManager 申请资源,并将具体的 SubTask 分配到 TaskManager 上执行。此外,它还负责触发 Checkpoint 以及故障时的容错恢复。
3. TaskManager(任务管理器):实际的工作节点
TaskManager 相当于集群中的 Worker(Slave),是真正执行数据处理逻辑的 JVM 进程。它的核心机制包括:
- Task Slot(任务槽位):Slot 是 TaskManager 中资源调度的最小单位。一个 TaskManager 可以包含多个 Slot,每个 Slot 代表一部分固定的内存资源。Slot 之间通过线程隔离来实现并发执行,从而减少上下文切换开销。
- 算子链(Operator Chain)优化:为了提升性能,Flink 会将上下游紧密度高的算子(如连续的 Map 操作)链接成一个 Task。这样多个算子可以在同一个线程中顺序执行,大幅降低了网络序列化和线程切换的延迟。
- 数据交换与状态管理:TaskManager 不仅负责执行算子逻辑,还要负责缓存数据、在网络间交换数据流(Shuffle),并在本地维护算子的状态信息以配合 Checkpoint 机制实现 Exactly-Once 语义。
综上所述,Flink 的架构通过 Client 解耦了任务提交与执行,利用 JobManager 实现了高度自动化的全局调度与容错,并通过 TaskManager 内部的 Slot 机制和算子链优化保证了极致的数据处理性能。