Flink源码解析(十三)——Flink On Yarn JobManager启动过程Dispatcher启动解析

一、JobManager启动过程Dispatcher启动解析

在上两篇随笔中介绍了Zookeeper Curator框架Leader选举过程和ClusterEntrypoint 3大核心组件基本功能及WebmonitorEndpoint、ResourceManager的启动过程。本篇随笔介绍核心组件Dispatcher的启动过程。

(1)、dispatcherRunnerFactory类型为DefaultDispatcherRunnerFactory,在调用createDispatcherRunner(...)方法中,入参会有一个Dispatcher独有的Leader选举服务,一个高可用的作业持久化组件等。

dispatcherLeaderProcessFactoryFactory类型是ApplicationDispatcherLeaderProcessFactoryFactory,通过createFactory(...)方法生成一个DispatcherLeaderProcessFactory实例,参与到DefaultDispatcherRunner实例构建过程中。

由上图可知DefaultDispatcherRunner通过create(...)方法新建一个DefaultDispatcherRunner实例。由类继承关系可知DefaultDispatcherRunner <- {DispatcherRunner, LeaderContender},它也是一个Leader选举候选者类,实例会参与到Leader选举的过程中。实例创建完成后紧接着调用start()方法启动Leader选举过程,该过程与前两篇随笔中WebmonitorEndpoint、ResourceManager Leader选举过程一样。

调用start()方法,start()方法的调用路径如下:

DefaultDispatcherRunner.start()
  DefaultLeaderElection.startLeaderElection(...)
  DefaultLeaderElectionService.register(...)
  DefaultLeaderElectionService.createLeaderElectionDriver(...)
  ZooKeeperLeaderElectionDriverFactory.create(...){
    new ZooKeeperLeaderElectionDriver(curatorFramework, leaderElectionListener);
  }
  ZooKeeperLeaderElectionDriver.isLeader()
  DefaultLeaderElectionService.onGrantLeadership(...)
  DefaultLeaderElectionService.onGrantLeadershipInternal(...)
  DefaultLeaderElectionService.notifyLeaderContenderOfLeadership(...)
  DefaultDispatcherRunner.grantLeadership(...)
  DefaultDispatcherRunner.startNewDispatcherLeaderProcess(...)
  DefaultDispatcherRunner.createNewDispatcherLeaderProcess(...)

最后会新建一个SessionDispatcherLeaderProcess实例并调用start()方法。

(2)、SessionDispatcherLeaderProcess实例start()方法执行,该实例通过父类AbstractDispatcherLeaderProcesss的start()方法调用startInternal(),将状态改为RUNNING后,执行SessionDispatcherLeaderProcess实例的onStart()方法。

如下图所示,在onStart()方法中,第一步执行startServices()方法,将SessionDispatcherLeaderProcess实例所代表的JobGraphListener添加到DefaultJobGraphStore启动过程中。第二步执行createDispatcherBasedOnRecoveredJobGraphsAndRecoveredDirtyJobResults()方法,因为Flink应用是新建状态,getDirtyJobResultsIfRunning()、recoverJobsIfRunning()都为空,随即执行createDispatcherIfRunning()方法,最后到createDispatcher(...)执行过程中。

(3)、dispatcherGatewayServiceFactory.create(...)过程如下,其中dispatcherGatewayServiceFactory类型是ApplicationDispatcherGatewayServiceFactory。在下图create(...)中,会先创建一个Dispatcher实例,创建时第5个入参是DispatcherBootstrapFactory类型的,参考随笔十,DispatcherBootstrapFactory实例最后会触发Flink应用main()方法的执行。最后启动Dispatcher服务。

(4)、dispatcher = dispatcherFactory.createDispatcher(...)方法解析,由之前类初始化时可知,dispatcherFactory类型为SessionDispatcherFactory.INSTANCE,调用createDispatcher(...)方法生成一个StandaloneDispatcher实例,继承关系如下:

StandaloneDispatcher <- Dispatcher <- {
FencedRpcEndpoint <- RpcEndpoint <- RpcGateway
DispatcherGateway <- FencedRpcGateway <- RpcGateway
}

由继承关系可知Dispatcher继承于RpcEndpoint,在调用start()方法时,实际上调用的是父类RpcEndpoint的start()方法,由Flink akka RPC框架可知,RpcEndpoint在启动start()方法时会回调onStart()方法,即如下图:

在onStart()方法中, startDispatcherServices()方法负责注册监控指标。因为Flink应用是第一次启动,startCleanupRetries()、startRecoveredJobs()2个方法都仅仅空执行。this.dispatcherBootstrap = this.dispatcherBootstrapFactory.create(...)方法负责启动Flink应用的main()方法。

二、JobGraph提交、ExecutionGraph生成入口的调用、JobMaster生成等过程解析

由第一节可知Dispatcher开始启动,但到此为止还未说明JobGraph提交过程、ExecutionGraph生成入口的调用过程、JobMaster生成过程等过程,结合this.dispatcherBootstrap = this.dispatcherBootstrapFactory.create(...)方法调用、随笔十提到的Flink应用main()方法触发、StreamExecutionEnvironment类中execute()方法来说明以上缺失的重大过程的执行情况。

(1)、由第一节及随笔十最后的说明可知Flink应用main()方法开始触发之前,即ClientUtils.executeProgram(...)方法里调用program.invokeInteractiveModeForExecution()之前,会设置流执行环境的工厂实例。如下图:

这样在调用program.invokeInteractiveModeForExecution()后触发Flink应用main(...)方法执行,用户在编写Flink应用时,第一步基本上都是以StreamExecutionEnvironment.getExecutionEnvironment();形式获取流执行环境,如下图所示。通过上面的工厂实例获取流执行环境StreamContextEnvironment,由初始化路径可知StreamContextEnvironment第一个参数executorServiceLoader类型为EmbeddedExecutorServiceLoader。

Flink应用最后一步基本上都是执行StreamExecutionEnvironment.execute()方法,开始Flink应用的运行。

通过一系列父类子类的方法调用,后面到达final PipelineExecutor executor = getPipelineExecutor();代码行,由上可知getPipelineExecutor方法里executorServiceLoader类型为EmbeddedExecutorServiceLoader。EmbeddedExecutorServiceLoader的getExecutorFactory(...)方法返回EmbeddedExecutorFactory实例,进而执行EmbeddedExecutorFactory实例的getExecutor(...)方法返回EmbeddedExecutor实例。

EmbeddedExecutor实例开始执行execute(...)方法,调用路径如下EmbeddedExecutor.execute(...) -> EmbeddedExecutor.submitAndGetJobClientFuture(...) -> PipelineExecutorUtils.getJobGraph(...) -> FlinkPipelineTranslationUtil.getJobGraph(...) -> StreamGraphTranslator.translateToJobGraph(...)获取Flink应用的JobGraph信息。在EmbeddedExecutor.submitAndGetJobClientFuture(...)方法里获取到JobGraph信息后会调用EmbeddedExecutor.submitJob(...)方法开始提交JobGraph信息。

(2)、由前面的初始化路径可知,dispatcherGateway的类型即为第一节中介绍的Dispatcher类。Dispatcher.submitJob(...)方法的执行路径为Dispatcher.submitJob(...) -> Dispatcher.internalSubmitJob(...) -> Dispatcher.persistAndRunJob(...) -> Dispatcher.runJob(...) -> Dispatcher.createJobMasterRunner(...)

在方法createJobMasterRunner(...)中jobManagerRunnerFactory.createJobManagerRunner(...)执行过程如下图所示:

可知继承关系如下:JobMasterServiceLeadershipRunner <- {JobManagerRunner、LeaderContender},JobMasterServiceLeadershipRunner本身也是一个Leader候选者类。在创建完JobMasterServiceLeadershipRunner实例后开始执行实例的start()方法进入候选Leader过程,经过一系列以下相同的方法调用后进入jobMasterServiceProcess = jobMasterServiceProcessFactory.create(leaderSessionId);

JobMasterServiceLeadershipRunner.start()
  DefaultLeaderElection.startLeaderElection(...)
  DefaultLeaderElectionService.register(...)
  DefaultLeaderElectionService.createLeaderElectionDriver(...)
  ZooKeeperLeaderElectionDriverFactory.create(...){
    new ZooKeeperLeaderElectionDriver(curatorFramework, leaderElectionListener);
  }
  ZooKeeperLeaderElectionDriver.isLeader()
  DefaultLeaderElectionService.onGrantLeadership(...)
  DefaultLeaderElectionService.onGrantLeadershipInternal(...)
  DefaultLeaderElectionService.notifyLeaderContenderOfLeadership(...)
  JobMasterServiceLeadershipRunner.grantLeadership(...)
  JobMasterServiceLeadershipRunner.startJobMasterServiceProcessAsync(...)
  JobMasterServiceLeadershipRunner.verifyJobSchedulingStatusAndCreateJobMasterServiceProcess(...)
  JobMasterServiceLeadershipRunner.createNewJobMasterServiceProcess(...)

  jobMasterServiceProcess = jobMasterServiceProcessFactory.create(leaderSessionId);

JobMasterServiceLeadershipRunner.createNewJobMasterServiceProcess(...)负责创建JobMasterServiceProcess实例。

在创建JobMasterServiceProcess实例过程中,jobMasterServiceFactory.createJobMasterService(leaderSessionId, this);会创建一个JobMaster实例,具体过程如下:

在JobMaster构造函数中会设置一系列的成员变量,其中schedulerNG成员代表Flink Task任务的调度器。调度器负责管理作业执行的所有相关过程。包括JobGraph到ExecutionGraph的转换过程、作业的发布、取消、停止过程、作业Task的发布、取消、停止过程、资源申请与释放、作业和Task的Failover等。

以下为createScheduler(...)方法的具体执行过程,在创建过程中有一步比较重要的操作就是触发ExecutionGraph的创建,过程如下。

在DefaultScheduler构造函数中,首先执行super(...)方法触发父类构造函数的执行。

父类SchedulerBase构成函数中就会通过以下方法触发ExecutionGraph实例的创建过程,可以接随笔九复习下ExecutionGraph的创建过程。

(3)、JobMaster.start()方法解析:

创建完后JobMaster实例后,随即执行jobMaster.start();方法开始ExecutionGraph的调度。本小节只初步介绍和组件服务有关的过程,具体的ExecutionGraph调度过程放到下一篇随笔详解。

JobMaster类的继承关系如:JobMaster <- {FencedRpcEndpoint、JobMasterGateway, JobMasterService},由Flink akka RPC框架可知,JobMaster.start()方法会触发rpcServer.start()方法,最后会回调到RpcEndpoint的onStart()方法上。

JobMaster.onStart()方法实现如下,主要由两大步骤组成,一是创建2个心跳服务,JobMaster -> TaskManager的心跳服务、ResourceManager -> JobMaster。二是执行ExecutionGraph调度,ExecutionGraph调度下篇随笔详细分析。

startJobMasterServices()方法创建JobMaster -> TaskManager的心跳服务、ResourceManager -> JobMaster的心跳服务,启动slotPool服务,获取ResourceManager的leader检索服务,创建JobMaster和ResourceManager的链接。

 

posted @ 2024-01-15 23:04  有一个娃  阅读(28)  评论(0编辑  收藏  举报