【Spark三十五】Standalone集群+Client部署模式下用户提交任务的执行流程

通过spark-sumbit提交Standalone集群+Clientr部署模式下的程序的流程

 

spark-submit提交程序

  • SparkSubmit相应提交程序请求
  • 由于是standalone集群+部署模式(deployMode)是client的方式,因此逻辑执行到在SparkSubmit的main方法里通过反射构造应用的class的main函数
  • 程序执行到程序的main函数中
  • 创建SparkContext对象

           1. 创建private[spark] var (schedulerBackend, taskScheduler) =   SparkContext.createTaskScheduler(this, master)

           2. 创建 dagScheduler = new DAGScheduler(this)

 

  • 在createTaskScheduler方法中,创建SparkDeploySchedulerBackend对象,SparkDeploySchedulerBackend继承自SparkDeploySchedulerBackend
  • 在SparkContext的构造方法中,调用TaskScheduler的start方法,在start方法内部调用SparkDeploySchedulerBackend的start方法
  • 在SparkDeploySchedulerBackend的start方法中,构造AppClient对象,并调用AppClient的start方法
  • 在AppClient中,执行preStart方法以调用registerWithMaster()方法,将Driver注册给Master。注册的动作实际上是AppClient给Master发送RegisterApplication消息,
  • 在Master的RegisterApplication消息处理中,调用Master的schedule方法(注意资源调度策略)
  • 在Master的schedule方法中调用launchExecutor方法
  • 在Master的launchExecutor方法中,给Worker发送LaunchExecutor消息
  • 在Workder的LaunchExecutor消息处理器中,创建ExecutorRunner对象,而ExecutorRunner则通过反射的方式创建一个Java进程,这个进程就是启动一个CoarseGrainedExecutorBackend进程
  • CoarseGrainedExecutorBackend是一个Actor,首先运行它的preStart方法,在它的preStart方法中,给Driver发送RegisterExecutor消息
  • 此处的Driver是在CoarseGrainedSchedulerBackend中定义的,当它收到RegisterExecutor时,调用CoarseGrainedSchedulerBackend的makeOffers方法
  • 在makeOffers中,调用launchTasks方法启动任务
  • 在launchTasks中,循环提交所有的Task(这本来是一个TaskSet任务集),每次循环给CoarseGrainedExecutorBackend发送LaunchTask消息
  • CoarseGrainedExecutorBackend处理LaunchTask时,调用Executor的launchTask方法
  • 在Executor的launchTask方法中,提交给Executor中的线程池执行

可见,standalone+client的方式,相对于standalone+cluster的方式,省略了如下三个步骤

  • ClientActor给Master发送RequestSubmitDriver消息
  • Master给Worker发送LaunchDriver的消息
  • Worker创建并启动Driver进程

如下图所示,第二步动作是在AppClient的preStart的registerWithMaster()方法中给Master发送的RegisterApplication消息。所以,Driver实际上并未向Master注册,而是发送了RegisterApplication消息。

 
【Spark三十五】Standalone集群+Client部署模式下用户提交任务的执行流程_第1张图片
 

 

你可能感兴趣的:(client)