当使用yarn管理我们的flink任务时,提交一个作业,yarn会帮我们启动一个task,还会起到job吗
这是一个很经典的问题。简单直接的答案是:会。
当使用 flink run -t yarn-per-job 模式提交作业时,YARN 不仅仅会启动一个 Task(指容器,Container),而是会完整地管理整个 Flink 集群的生命周期——包括 JobManager 和 TaskManager 的启动。
下面我将为你详细拆解这个“启动”过程,并澄清一些容易混淆的概念。
一、核心概念辨析:AppMaster (JobManager) vs Container (TaskManager)
首先需要区分两个关键角色:
-
JobManager (JM):Flink 作业的“主节点”,负责调度 Task、协调 Checkpoint、管理资源。在 YARN 中,它就运行在 AppMaster (Application Master) 容器中。
-
TaskManager (TM):Flink 作业的“工作节点”,负责执行具体的计算任务(Task Subtask)。每一个 TM 对应一个 YARN 容器。
二、详细启动流程(per-job 模式)
以最常用的 yarn-per-job 模式为例(这是生产环境最常用的方式),YARN 实际启动了至少两个容器:
-
客户端提交作业:
-
你执行命令后,Flink 客户端会将作业 JAR、配置等上传到 HDFS。
-
然后向 YARN RM (ResourceManager) 申请启动一个 Application Master (AppMaster)。
-
-
YARN 启动 JobManager (AppMaster):
-
YARN RM 在某台 NodeManager 上分配第一个容器,启动
FlinkYarnSessionCli的ApplicationMaster类。 -
在这个容器里,JobManager 进程被拉起。
-
关键点: 这个容器既是 YARN 层面的 AppMaster,也是 Flink 层面的 JobManager。所以“启动了一个容器”同时意味着“启动了 Job”。
-
-
JobManager 向 YARN 申请 TaskManager 容器:
-
JobManager 启动后,它本身并不执行计算。它会立即向 YARN RM 申请额外的容器来运行 TaskManager。
-
申请的数量由并行度 (
-p) 或 Slot 数量决定。
-
-
YARN 启动 TaskManager (Worker):
-
YARN RM 分配新的容器给 JobManager 的请求。
-
在这些新容器中,TaskManager 进程被拉起。
-
-
作业运行:
-
JobManager 将执行图分发到各个 TaskManager 的 Slot 中。
-
这时,具体的计算任务(Operator Chain,即 Subtask)才开始在 TaskManager 容器里运行。
-
三、图解过程

四、补充:YARN Session 模式的区别
如果使用 -t yarn-session 模式,流程略有不同:
-
先启动 Session 集群:你需要先执行
yarn-session.sh,此时 YARN 会启动一个 JobManager 容器 + 若干 TaskManager 容器。这个集群会一直常驻。 -
再提交作业:然后你执行
flink run指向这个 Session 集群。此时,YARN 不会启动任何新容器。作业直接提交到已存在的 JobManager 上。
总结:
-
Per-Job 模式:一个 Flink 作业 = 一个 JobManager 容器 + N 个 TaskManager 容器。所有容器都是 YARN 管理的。作业结束后,所有容器被回收。
-
Session 模式:一个 Flink 集群(可能跑多个作业) = 一个 JobManager 容器 + N 个 TaskManager 容器。作业提交时不再启动新容器。
五、实际操作验证
你可以在提交作业后,通过 YARN 的 Web UI (http://your-yarn-rm:8088) 看到一个正在运行的 Application。
点击进入该 Application,你会看到:
-
AppMaster:对应 JobManager。
-
Containers 列表里:
-
第一个通常是
Type: AppMaster(运行 JobManager)。 -
后面几个是
Type: TaskManager(运行计算任务)。
-
你的理解很准确:启动 JobManager 是 YARN 启动任务的最终目的,计算任务本身只是 JobManager 分配给 TaskManager 的“子任务”。而 JobManager 所在的容器既是“任务”也是“管理节点”。
更多推荐

所有评论(0)