spark-6 spark运行架构和任务调度

spark运行架构

简单来讲:driver端划分任务,向资源管理器发送申请资源,executor向driver端(不是MAster)申请task,负责执行任务
spark-6 spark运行架构和任务调度

  1. Driver端向资源管理器Master(可能是HMaster或者yarn的NodeManager)发送注册和申请计算资源的请求

  2. Master通知对应的worker节点启动executor进程(计算资源)

  3. executor进程向Driver端发送注册并申请task请求

  4. Driver端运行客户端的main方法,构建sparkcontext对象,在sparkcontext对象内部一次构建DAGSchedulerTaskScheduler

  5. 按照客户端代码生成rdd的一系列操作顺序,生成DAG有向无环图

  6. DAGScheduler拿到DAG有向无环图之后,按照宽依赖进行stage的划分。每一个stage内部有很多可以并行运行的task,最后封装在一个一个的taskSet集合中,然后把taskSet发送给TaskScheduler

  7. TaskScheduler得到taskSet集合之后,依次遍历取出每一个task提交到worker节点上的executor进程中运行

  8. 所有task运行完成,Driver端向Master发送注销请求,Master通知Worker关闭executor进程,Worker上的计算资源得到释放,最后整个任务也就结束了。

几点注意事项

  • 为什么说 Driver端运行客户端的main方法?
    • 因为driver端既可能运行在客户端本地也可能运行在集群上,driver端不等同于客户端。
  • 谁负责划分任务
    • driver端负责划分
      • 先生成DAG有向无环图
      • 然后根据有向无环图划分stage
      • 在把每个stage中的task封装到一个taskset中,同一个taskset中的stage可以并行执行
  • DAGSheduler提交给TaskScheduler的基本单位是什么?
    • taskset
  • executor执行的基本单位是什么?
    • 基本单位是task
  • 注意第七步
    • Master负责资源的调度,当driver和executor都完成注册后,executor直接向driver端的taskscheduler申请task,此处不再经过Master

spark任务调度

spark-6 spark运行架构和任务调度

  1. Driver端运行客户端的main方法,构建SparkContext对象,在SparkContext对象内部依次构建DAGScheduler和TaskScheduler

  2. 按照rdd的一系列操作顺序,来生成DAG有向无环图

  3. DAGScheduler拿到DAG有向无环图之后,按照宽依赖进行stage的划分。每一个stage内部有很多可以并行运行的task,最后封装在一个一个的taskSet集合中,然后把taskSet发送给TaskScheduler

  4. TaskScheduler得到taskSet集合之后,依次遍历取出每一个task提交到worker节点上的executor进程中运行。

  5. 所有task运行完成,整个任务也就结束了

注意

  • 当taskScheduler执失败会返回DAGScheduler,再走一遍提交流程

基于wordcount程序剖析spark任务的提交、划分、调度流程

spark-6 spark运行架构和任务调度