spark深度解析——Standalone模式下,核心流程解析!

在Standalone模式下,Spark中各个组件之间交互还是比较复杂的,但是对于一个通用的分布式计算系统来说,这些都是非常重要而且比较基础的交互。首先,为了理解组件之间的主要交互流程,我们给出一些基本要点:

一个Application会启动一个Driver

一个Driver负责跟踪管理该Application运行过程中所有的资源状态和任务状态

一个Driver会管理一组Executor

一个Executor只执行属于一个DriverTask

核心组件之间的主要交互流程,如下图所示:

              

上图中,通过不同颜色或类型的线条,给出了如下6个核心的交互流程,我们会详细说明:

橙色:提交用户Spark程序

用户提交一个Spark程序,主要的流程如下所示:

  1. 用户spark-submit脚本提交一个Spark程序,会创建一个ClientEndpoint对象,该对象负责与Master通信交互
  2. ClientEndpoint向Master发送一个RequestSubmitDriver消息,表示提交用户程序
  3. Master收到RequestSubmitDriver消息,向ClientEndpoint回复SubmitDriverResponse,表示用户程序已经完成注册
  4. ClientEndpoint向Master发送RequestDriverStatus消息,请求Driver状态
  5. 如果当前用户程序对应的Driver已经启动,则ClientEndpoint直接退出,完成提交用户程序
    总结:提交driver程序!!!!!!!!!!!!!!!!! 

紫色:启动Driver进程

当用户提交用户Spark程序后,需要启动Driver来处理用户程序的计算逻辑,完成计算任务,这时Master协调需要启动一个Driver,具体流程如下所示:

  1. Maser内存中维护着用户提交计算的任务Application,每次内存结构变更都会触发调度,向Worker发送LaunchDriver请求
  2. Worker收到LaunchDriver消息,会启动一个DriverRunner线程去执行LaunchDriver的任务
  3. DriverRunner线程在Worker上启动一个新的JVM实例,JVM实例内运行一个Driver进程,该Driver会创建SparkContext对象
    总结:启动Driver程序,创建SparkContext对象!!!!!!!!!!!!!!!!!!
     

红色:注册Application

Dirver启动以后,它会创建SparkContext对象,初始化计算过程中必需的基本组件,并向Master注册Application,流程描述如下:

  1. 创建SparkEnv对象,创建并管理一些基本组件
  2. 创建TaskScheduler,负责Task调度
  3. 创建StandaloneSchedulerBackend,负责与ClusterManager进行资源协商
  4. 创建DriverEndpoint,其它组件可以与Driver进行通信
  5. 在StandaloneSchedulerBackend内部创建一个StandaloneAppClient,负责处理与Master的通信交互
  6. StandaloneAppClient创建一个ClientEndpoint,实际负责与Master通信
  7. ClientEndpoint向Master发送RegisterApplication消息,注册Application
  8. Master收到RegisterApplication请求后,回复ClientEndpoint一个RegisteredApplication消息,表示已经注册成功
    总结:像master注册,Application对象!!!!!!!!!!!!!!!!!!!!!
     

蓝色:启动Executor进程

  1. Master向Worker发送LaunchExecutor消息,请求启动Executor;同时Master会向Driver发送ExecutorAdded消息,表示Master已经新增了一个Executor(此时还未启动)
  2. Worker收到LaunchExecutor消息,会启动一个ExecutorRunner线程去执行LaunchExecutor的任务
  3. Worker向Master发送ExecutorStageChanged消息,通知Executor状态已发生变化
  4. Master向Driver发送ExecutorUpdated消息,此时Executor已经启动
    总结:master像woker发送消息,启动Executor !!!!!!!!!!!!!!!!!!!!!

粉色:启动Task执行

  1. StandaloneSchedulerBackend启动一个DriverEndpoint
  2. DriverEndpoint启动后,会周期性地检查Driver维护的Executor的状态,如果有空闲的Executor便会调度任务执行
  3. DriverEndpoint向TaskScheduler发送Resource Offer请求
  4. 如果有可用资源启动Task,则DriverEndpoint向Executor发送LaunchTask请求
  5. Executor进程内部的CoarseGrainedExecutorBackend调用内部的Executor线程的launchTask方法启动Task
  6. Executor线程内部维护一个线程池,创建一个TaskRunner线程并提交到线程池执行
    总结:Executor 启动 task 执行 程序 !!!!!!!!!!!!!!!!!!!!!

绿色:Task运行完成

  1. Executor进程内部的Executor线程通知CoarseGrainedExecutorBackend,Task运行完成
  2. CoarseGrainedExecutorBackend向DriverEndpoint发送StatusUpdated消息,通知Driver运行的Task状态发生变更
  3. StandaloneSchedulerBackend调用TaskScheduler的updateStatus方法更新Task状态
  4. StandaloneSchedulerBackend继续调用TaskScheduler的resourceOffers方法,调度其他任务运行

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章