flink任务执行与提交3-JobGraph的提交和JobManager的初始化

544 阅读4分钟

上文提到了使用PipelineExecutor.execute(),在该方法中getJobGraph(pipeline, configuration)会将StreamGraph转换为JobGrah。接着,使用了ClusterClient.submit(JobGraph)方法将JobGraph提交集群中去.具体来说是ClusterClient调用了Dispatcher.submit(JobGraph)的RPC方法

1.JobGraph的提交整体流程

  • 当JobGraph被提交到集群运行后,集群会通过Dispatcher组件接受提交的JobGraph对象,Dispatcher组件会通过JobManagerRunnergFactory创建JobManagerRunner实例,最终调用JobManangerRunner启动JobManager服务。JobManager服务的底层主要是JobMasterClass实现,负责整个作业的生命周期和Task调度工作。
  • 总的来说,整个流程就是由Dispatcher.submitJob(JobGraph)开启,生成JobManager一直到JobManager中的成员变量jobMaster.startJobExecution代表整个JobGraph开始被处理,下一步就是将JobGraph生成为ExecutionGraph结构

2. JobManager的构建

在flink源码中没有名字为JobManager的类或者是相关接口,一般都是以JobManagerRunnerImpl来指代,主要通过JobManagerRunner和JobMaster来完成整个JobManager的功能实现

2.1 JobManagerRunnerImpl的结构

图一为JobManagerRunnerImpl的数据结构。JobManagerRunnerImpl是JobManagerRunner的实现类。 JobManagerRunnerImpl同时还实现了LeaderContender接口,主要是可以参与LeaderShip的竞争,实现JobManagerRunner高可用。 实现了OnCompletionAction接口,执行Job处于中止状态的后续操作。

  • JobMasterService: 该成员变量是一个接口,其实现类为jobMaster。

JobManagerRunnerImpl结构图.png 图一

2.2 JobMaster的相关结构

2.2.1 JobMaster的继承关系

JobMaster继承图.png

图二
  • FencedRpcEndpoint: 抽象类,因为继承了FencedRpcEndpoint节点,使得JobMaster成RPC服务节点
  • JobMasterGateway: 主要定义了JobMaster的RPC接口方法,包括取消Job,更新任务状态,请求下一个split,请求partition的当前状态
  • JobMasterService:主要定义了JobMaster的启动、暂停等方法
  • CheckpointCoordinatorGateway:主要用于在Task执行过程中向CheckpointCoordinator汇报当前Task的Checkpoint执行情况
  • FencedRpcGateway:RPC核心服务需要实现的接口,集群中的Dispatcher等RPC组件都会实现该RpcGateway接口
  • KvStateLocationOracle:主要用于QueryableState模块根据状态key获取Key-Value类型状态所在的位置信息
  • KvStateRegistryGateway:主要用于注册QueryableState模块中需要用到的Key-Value类型状态,如果状态设定为Queryable类型,会将状态信息注册在KvStateRegistry中。

2.2.2 JobMaster的结构图

JobMasterService结构图.png

图三
  • JobMasterConfiguration: 主要定义了JobMaster服务中需要的参数
  • recourceID: 资源ID
  • jobGraph: 对应Job提交的jobGraph
  • highAvailabilityServices: 高可用服务接口,主要用于获取resourceManagerLeaderRetriver,可以通过resourceManagerLeaderRetriever获取ResourceManager的Leader节点
  • blobWriter:将对象数据写入BlobStore中,主要用于Task调度和执行过程中对TaskInformation的进行持久化
  • sheduledExecutorService: JDK中提供定时调度ExecutorService,主要用于Task的调度的执行,通过JOb执行状态切换过程中的定时调度任务
  • userCodeLoader: JobGraph中对应的UserClassLoader实现类,主要用于加载和实例化用户写的flink编码
  • slotPool:用于管理JobManager的Slot资源,包括JobManager中的资源使用、分配、申请以及TaskManager的注册和释放、接收ResourceManager提供的Slot资源
  • scheduler: 现存调度器的基本接口,继承了SlotProvider-为ready-to-run的tasks提供slots,SlotOwner-获取slots的组件以及释放或者回收slots的组件,和SlotPool配合使用.scheduler调用Slotpool中的方法进行
  • registeredTaskManagers:注册在JobManager中的TaskExecutor信息,当有新的TaskExecutor启动时,通知JobLeaderService中的监听器,将TaskExecutor注册在registeredTaskManagers中
  • shuffleMaster:主要用于注册和管理任务中的shuffle信息。
  • jobManagerJobMetricGroup: 主要用于定义Job中产生的Metric健康治病并通过MetricGroup进行存储和管理。
  • resourceManagerAddress:存放ResourceManager的地址信息相关内容
  • resourceManagerConnection:创建于ReourceManager之间的RPC连接。
  • accumulators:用于存储在Job中创建和用到的累加器
  • partitionTracker:主要用于对Job中的Partition信息进行追踪。并提供startTrackingPartition()、stopTrackingAndReleasePartitions()等方法,启动和释放TaskExecutor及ShuffleMaster中的Partition信息

2.2.3 Scheduler实现

在JobMaster成功申请到Slot计算资源后,会创建Scheduler组件来调度和执行JobGraph的任务,除此之外,Scheduler还继承了SlotProvider和SlowOwner,主要用于slot资源的申请和取消,slot资源主要是以LogicalSlot形式提供的。不是真正的Slot计算资源。实际的Physical Slot主要是在TaskExecutor中进行分配的。

  • slotPool: Scheduler主要是通过SlotPool来对Slot资源进行申请

Scheduler结构图.png

图四

3.参考文献

Flink设计与实现核心原理与源码解析