本节摘要:Flink 集群由资源层、JobManager、TaskManager 三层构成:JobManager 负责调度与协调,TaskManager 负责执行与数据交换,Slot 是两者之间的资源契约。本节逐个拆解这些组件的职责与协作关系,并澄清并行度、槽位、任务之间最常被混淆的概念。
一个作业提交上去就"自己跑起来了",可它到底跑在谁身上?为什么有时资源明明够、作业却申请不到槽位?要回答这些值班室高频问题,得先把集群当机器拆开看零件。本节是第 2 章的地基站:认识三位主角——管事的 JobManager、干活的 TaskManager、以及给它们提供落脚点的资源层。第 1 章我们只从远处看过引擎的轮廓,现在走进机房。
先抛一个问题:一个作业包含两百个并行子任务,集群只有五十个槽位,作业能启动吗?很多人凭直觉答"不能"。带着这个疑问往下读,读完你应该能自己推翻它——这正是理解 Slot 语义的价值所在。
JobManager 不是单一进程,而是一组协作角色。在不同部署模式下它们的合并方式不同,但职责可以拆成三块:
三个角色的分工可以用一句值班黑话记牢:Dispatcher 管迎宾,ResourceManager 管分房,JobMaster 管施工。生产集群为高可用会部署多个 JobManager 实例,主备之间靠选举协作,这块留到第 6 章细讲。
TaskManager 是真正执行代码的 JVM 进程。它启动时向 ResourceManager 注册自己带来的槽数——每个槽位是一份固定的计算资源配额(主要指受管理的内存切片)。任务线程跑在槽位里,数据交换走 TaskManager 之间的网络栈。
这里必须澄清全册最容易混的三个概念:
关键规则是:默认策略下,同一作业的不同算子可以共享一个槽位。于是"两百个并行子任务、五十个槽位"完全可行——只要作业的算子链组织得当,五十个槽位每个跑一段"管道",整条数据流照样通畅。槽位共享的价值正在于此:资源需求取决于全作业最重的算子,而不是所有算子的总和。
# 每个 TaskManager 的槽位数:多槽位能提高资源利用率,但加剧进程内资源竞争 taskmanager.numberOfTaskSlots: 4 # 受管理内存按槽位均分:调槽位数前先算清每槽能分到多少 taskmanager.memory.managed.fraction: 0.4

第三层是资源层,决定 TaskManager 进程"住在哪、谁拉起"。三种典型形态各有值班要点:Standalone 模式自带常驻进程,简单直接,但故障恢复要靠 Flink 自身;YARN 模式把资源管理交给 Hadoop 体系,容器化分配,适合与老大数据平台混部;Kubernetes 模式是当前新建集群的主流,弹性伸缩与故障重拉由控制器完成,第 6 章讲部署模式时会对比三者的取舍。理解这一层的意义在于:当作业反复重启时,你要能分清是 Flink 在重启任务,还是资源层在重启容器——两者的日志位置和处置方式完全不同。
把组件知识浓缩成三个值班手册风格的问答,遇到对应告警时可以直接翻牌。问答一:告警"槽位申请不到",先看什么? 先看 ResourceManager 日志确认是"没有空闲槽位"还是"申请容器失败":前者查现有作业的槽位占用(谁家作业把槽位占满还没释放),后者查资源层配额与镜像。两种病因一个症状,先分岔再动手能省一半时间。问答二:TaskManager 数量明明够,作业还是反复重启? 查重启的真正原因——任务失败重拉与容器被资源层回收是两条路径;如果是后者,多半是进程内存超限被系统杀掉(内存分区配比问题,第 8 章的账本),Flink 侧的重启日志只会告诉你"容器异常退出",要往下追一层。问答三:Web UI 上作业是绿的,业务方却说没数据? 绿灯只代表任务线程活着,不代表数据在流——查源的流入指标与水印推进;流入为零查上游与连接器,流入正常而下游空白查算子逻辑(比如过滤条件把数据全滤没了)。三个问答共享一个方法论:告警文本只是入口,组件职责链才是路标。
顺手补一条冷知识收尾:JobManager 与 TaskManager 可以跑在同一台物理机上(小集群常见),但生产环境强烈建议分离部署——大脑与肌肉共患难的结果,往往是一台机器故障让"指挥与执行"同时失联,故障半径从"损失一批任务"放大到"整作业失联"。架构分层不仅写在代码里,也写在机柜规划里。
认识了零件,下一节看它们如何协作运转:一段数据从进入作业到流出结果,在算子与槽位之间经历了什么。