1. 概述

用户提交的 Flink Job 会被转化成一个 DAG 任务运行,分别是:StreamGraphJobGraphExecutionGraphFlinkJobManagerTaskManagerJobManagerClient 的交互是基于Akka工具包的,是通过消息驱动。整个Flink Job的提交还包含着ActorSystem的创建,JobManager的启动,TaskManager的启动和注册。

2.任务提交流程

2.1.Standalone

  1. App 程序通过 rest 接口提交给 Dispatcher[ rest接口是跨平台,并且可以直接穿过防火墙,不需考虑拦截]。
  2. DispatcherJobManager 进程启动,把应用交给JobManager
  3. JobManager拿到应用后,向ResourceManager申请资源(slots),ResouceManager会启动对应的TaskManager进程,TaskManager空闲的slots会向ResourceManager注册。
  4. ResourceManager会根据JobManager申请的资源数量,向TaskManager发出指令(这些slots由你提供给JobManager)。
  5. 接着,TaskManager可以直接和JobManager通信了(它们之间会有心跳包的连接),TaskManager向JobManager提供slots,JobManager向TaskManager分配在slots中执行的任务。
  6. 最后,在执行任务过程中,不同的TaskManager会有数据之间的交换。

2.2. Yarn

  1. 提交 App 之前,先上传 FlinkJar 包和配置到 HDFS ,以便 JobManagerTaskManager 共享HDFS 的数据。
  2. 客户端向ResourceManager提交Job,ResouceManager接到请求后,先分配container资源,然后通知NodeManager启动ApplicationMaster。
  3. ApplicationMaster会加载HDFS的配置,启动对应的JobManager,然后JobManager会分析当前的作业图,将它转化成执行图(包含了所有可以并发执行的任务),从而知道当前需要的具体资源。
  4. 接着,JobManager会向ResourceManager申请资源,ResouceManager接到请求后,继续分配container资源,然后通知ApplictaionMaster启动更多的TaskManager(先分配好container资源,再启动TaskManager)。container在启动TaskManager时也会从HDFS加载数据。
  5. 最后,TaskManager启动后,会向JobManager发送心跳包。JobManager向TaskManager分配任务。

3. Graph

3.1. StreamGraph

3.2. JobGraph

3.3. ExecutionGraph

3.4. 物理执行图