任务调度流程

(6)flink on yarn的任务提交流程以及原理_ flink开发

  1. 任务提交后,client向hdfs上传flink的jar包以及配置
  2. 向Yarn的ResourceManager提交任务
  3. ResourceManager分配Container资源并通知对应的NodeManager启动ApplicationMaster
  4. ApplicationMaster启动后加载flink的jar包和构建环境,启动JobManager
  5. ApplicationMaster向ResourceManager申请资源启动taskManager
  6. nodemanager加载flink的jar包和配置环境启动TaskManager
  7. taskManager发送心跳包,等待JobManager向其分配任务

任务调度原理

(6)flink on yarn的任务提交流程以及原理_flink教程_02
客户端不是运行时和程序执行的一部分,但它用于准备并发送dataflow(JobGraph)给Master(JobManager),然后,客户端断开连接或者维持连接以等待接收计算结果。
当 Flink 集群启动后,首先会启动一个 JobManger 和一个或多个的 TaskManager。由 Client 提交任务给 JobManager,JobManager 再调度任务到各个 TaskManager 去执行,然后 TaskManager 将心跳和统计信息汇报给 JobManager。TaskManager 之间以流的形式进行数据的传输。上述三者均为独立的 JVM 进程。

Client

提交 Job 的客户端,可以是运行在任何机器上(与JobManager 环境连通即可)。提交 Job 后,Client 可以结束进程 (Streaming的任务),也可以不结束并等待结果返回。

JobManager

负责调度 Job 并协调 Task 做 checkpoint,职责上很像 Storm 的 Nimbus。从 Client 处接收到 Job 和 JAR 包等资源后,会生成优化后的执行计划,并以 Task 的单元调度到各个 TaskManager 去执行

TaskManager

在启动的时候就设置好了槽位数(Slot),每个 slot 能启动一个 Task,Task 为线程。从 JobManager 处接收需要部署的 Task,部署启动后,与自己的上游建立 Netty 连接,接收数据并处理。

执行图

flink的执行图可以分为四层

StreamGraph

根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构

JobGraph

StreamGraph经过优化后生成了 JobGraph,提交给 JobManager 的数据结构。主要的优化为,将多个符合条件的节点 chain 在一起作为一个节点,这样可以减少数据在节点之间流动所需要的序列化/反序列化/传输消耗。

ExecutionGraph

JobManager 根据 JobGraph 生成ExecutionGraph。ExecutionGraph是JobGraph的并行化版本,是调度层最核心的数据结构。

物理执行图

JobManager 根据 ExecutionGraph 对 Job 进行调度后,在各个TaskManager 上部署 Task 后形成的“图”,并不是一个具体的数据结构。
(6)flink on yarn的任务提交流程以及原理_flink教程_03