目录
高层级抽象视角
Flink 的提交流程,随着部署模式、资源管理平台的不同,会有不同的变化。首先我们从一个高层级的视角,来做一下抽象提炼,看一看作业提交时宏观上各组件是怎样交互协作的。
具体步骤如下:
(1)一般情况下,由客户端(App)通过分发器提供的REST接口,将作业提交给JobManager;
(2)由分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster;
(3)JobMaster 将 JobGraph 解析为可执行的 ExecutionGraph,得到所需的资源数量,然后向资源管理器请求任务槽资源(slots);
(4)资源管理器判断当前是否由足够的可用资源;如果没有,启动新的 TaskManager;
(5)TaskManager 启动之后,向 ResourceManager 注册自己的可用任务槽(slots);
(6)资源管理器通知 TaskManager 为新的作业提供 slots;
(7)TaskManager 连接到对应的 JobMaster,提供 slots;
(8)JobMaster 将需要执行的任务分发给 TaskManager;
(9)TaskManager 执行任务,互相之间可以交换数据。
如果部署模式不同,或者集群环境不同(例如 Standalone、YARN、K8S 等),其中一些步骤可能会不同或被省略,也可能有些组件会运行在同一个 JVM 进程中。比如我们在上一章实践过的独立集群环境的会话模式,就是需要先启动集群,如果资源不够,只能等待资源释放,而不会直接启动新的 TaskManager。
接下来我们就具体介绍一下不同部署环境下的提交流程。
独立模式 Standalone
在独立模式(Standalone)下,只有会话模式和应用模式两种部署方式。两者整体来看流程是非常相似的:TaskManager 都需要手动启动,所以当 ResourceManager 收到 JobMaster 的请求时,会直接要求 TaskManager 提供资源。而 JobMaster 的启动时间点,会话模式是预先启动,应用模式则是在作业提交时启动
YARN 集群
接下来我们再看一下有资源管理平台时,具体的提交流程。我们以 YARN 为例,分不同的部署模式来做具体说明。
会话(Session)模式
在会话模式下,我们需要先启动一个 YARN session,这个会话会创建一个 Flink 集群。
这里只启动了 JobManager,而 TaskManager 可以根据需要动态地启动。在 JobManager 内部,由于还没有提交作业,所以只有 ResourceManager 和 Dispatcher 在运行。
接下来就是真正提交作业的流程:
(1)客户端通过 REST 接口,将作业提交给分发器;
(2)分发器启动 JobMaster,并将作业(包含 JobGraph)提交给 JobMaster;
(3)JobMaster 向资源管理器请求资源(slots);
(4)资源管理器向 YARN 的资源管理器请求 container 资源;
(5)YARN 启动新的 TaskManager 容器;
(6)TaskManager 启动之后,向 Flink 的资源管理器注册自己的可用任务槽;
(7)资源管理器通知 TaskManager 为新的作业提供 slots;
(8)TaskManager 连接到对应的 JobMaster,提供 slots;
(9)JobMaster 将需要执行的任务分发给 TaskManager,执行任务。
单作业(Per-Job)模式
在单作业模式下,Flink 集群不会预先启动,而是在提交作业时,才启动新的 JobManager。
(1)客户端将作业提交给 YARN 的资源管理器,这一步中会同时将 Flink 的 Jar 包和配置上传到 HDFS,以便后续启动 Flink 相关组件的容器;
(2)YARN 的资源管理器分配容器(container)资源,启动 Flink JobManager,并将作业提交给 JobMaster。这里省略了 Dispatcher 组件;
(3)JobMaster 向资源管理器请求资源(slots);
(4)资源管理器向 YARN 的资源管理器请求容器(container);
(5)YARN 启动新的 TaskManager 容器;
(6)TaskManager 启动之后,向 Flink 的资源管理器注册自己的可用任务槽;
(7)资源管理器通知 TaskManager 为新的作业提供 slots;
(8)TaskManager 连接到对应的 JobMaster,提供 slots;
(9)JobMaster 将需要执行的任务分发给 TaskManager,执行任务。
应用(Application)模式
应用模式与单作业模式的提交流程非常相似,只是初始提交给 YARN 资源管理器的不再是具体的作业,而是整个应用。一个应用中可能包含了多个作业,这些作业都将在 Flink 集群中启动各自对应的 JobMaster。