# Flink运行时的架构组件有哪些?
Flink 运行时采用典型的 Master-Worker(主从架构),核心组件主要分为两大角色:JobManager(Master)和 TaskManager(Worker),同时依赖一个客户端(Client)来提交作业。
具体组件及其职责如下:
# JobManager(作业管理器)集群的“大脑”
它是整个任务调度的中心,负责协调和 checkpoint 协调。一个集群通常有一个活跃的 JobManager(HA 模式下会有备用节点)。
Dispatcher(分发器):接收客户端提交的作业,为每个作业启动一个新的 JobMaster。同时提供 RESTful API 来查询监控信息。
JobMaster(作业主控):负责管理单个具体的 JobGraph(作业图)。它会向 ResourceManager 申请资源(Task Slot),并将 JobGraph 转换为 ExecutionGraph,然后调度 Task 到 TaskManager 执行。
ResourceManager(资源管理器):负责管理 TaskManager 的插槽(Slot)。它负责启动新的 TaskManager 或空闲时回收资源。Flink 有多种实现(如 Standalone、YARN、K8s)。
# TaskManager(任务管理器)数据处理的“工人”
负责执行具体的计算任务。每个 TaskManager 是一个独立的 JVM 进程。
Task Slot(任务插槽):TaskManager 内部划分为多个 Slot,这是资源调度的最小单位。一个 Slot 可以运行一个或多个 Task(可能共享)。
Network & Memory Manager:管理网络传输和内存分配,确保数据在算子之间高效流动。
# Client(客户端)
不是运行时的一部分,而是用于提交作业。
负责解析用户代码,生成 StreamGraph 和 JobGraph 并提交给 JobManager。
提交完成后可以断开(分离模式),也可以保持连接获取进度(打印结果)。
# 核心交互流程(快速理解)
Client 编译代码,生成 JobGraph 发给 Dispatcher。
Dispatcher 为作业启动 JobMaster。
JobMaster 向 ResourceManager 请求可用 Slot。
ResourceManager 通知空闲的 TaskManager 申请到 Slot。
JobMaster 将 Task 部署到这些 Slot 上执行。
TaskManager 之间通过网络 Shuffle 交换数据。
# 补充说明:在不同的部署模式下,角色略有差异
- Standalone 模式:需要预先启动所有 JobManager 和 TaskManager 进程。
- YARN/K8s 模式:ResourceManager 会动态申请容器来启动 TaskManager,作业结束后自动释放资源