ITPub博客

首页 > 大数据 > > Spark TaskScheduler创建启动 源码剖析

Spark TaskScheduler创建启动 源码剖析

作者:格伯纳 时间:2020-05-12 12:02:36 0 删除 编辑

spark任务的真正的运行时由action算子进行一个触发,最终调用sc.runJob方法,在driver端会初始化2个重要的组建DagScheduler和TaskScheduler

TaskScheduler的主要职责:

  1. 负责将DagScheduler发送过来的的taskset放入到Taskset的缓冲池中
  2. TaskScheduler中的实现类TaskSchedulerImpl —》创建TasksetManager来进行对Taskset缓冲池中的Taskset进行管理(主要是管理的是Taskset的生命周期)

我们在阅读SparkContext中涉及到创建TaskScheduler方法createTaskScheduler

sparkContext,master,deployMode三个入参

返回一个元组,元组内元素为schedulerBackend,taskScheduler

createTaskScheduler根据入参master做了case分支匹配,

以standalone模式为例,master为spark://host:7077,根据master匹配结果,创建TaskSchedulerImpl对象,创建StandaloneSchedulerBackend对象

调用TaskSchedulerImpl的initialize初始化方法

TaskSchedulerImpl源码入口如下:

TaskSchedulerImpl的initialize初始化方法

任务的最终调度实际上都是落实到接口Scheduler的具体实现上的

TaskSchedulerImpl的调度模式有FAIR和FIFO两种

以默认的FIFO调度为例,TaskSchedulerImpl的初始化过程如下:

  1. 使TaskSchedulerImpl持有LocalBackend的引用
  2. 创建调度池rootPool,rootPool中缓存了调度队列、调度算法及TaskSetManager集合等信息
  3. 创建FIFOSchedulableBuilder,用来操作rootPool中的调度队列

初始化方法执行完毕后,将创建好的 (backend, scheduler)返回

SparkContext得到返回元组 (backend, scheduler)

接下来创建DAGScheduler

DAGScheduler主要负责分析用户提交的应用,并根据计算任务的依赖关系建立DAG,然后将DAG划分为不同的Stage,其中每个Stage由可以执行的一组Task构成,这些Task的执行逻辑完全相同,只是作用于不同的数据。而且DAG在不同的资源管理框架下的实现是相同的。DAG将这组Task划分完成后,会将这组Task提交到TaskScheduler。TaskScheduler通过Cluster Manager在集群的某个Worker的Executor上启动任务。

在taskScheduler设置好DAGScheduler的引用后,开启TaskScheduler

来看StandaloneSchedulerBackend

org.apache.spark.scheduler.SchedulerBackend是一个trait,是TaskScheduler的调度后端接口

TaskScheduler给Task分配集群资源实际是通过SchedulerBackend完成的

SchedulerBackend向当前等待分配计算资源的Task分配资源,分配完后与分配Task的Executor进行通信,在该Executor上启动Task,进行计算

在standalone模式下,StandaloneSchedulerBackend继承自CoarseGrainedSchedulerBackend是TaskScheduler Standalone Cluster Manager后端的实现

作用于Driver内,用于Standalone模式下资源管理器、与Executor通信,Task资源分配

StandaloneSchedulerBackend的start方法,调用父类CoarseGrainedSchedulerBackend的start方法

createDriverEndpointRef该方法获取Driver EndpointRef,但最开始的操作为向RpcEnv注册DriverEndpoint

Driver Endpoint向RpcEnv注册,创建了一个DriverEndpoint,DriverEndpoint用于提交task到Executor,接收Executor返回的计算结果


TaskScheduler 原理小结:

  1. DAGScheduler 在提交Taskset给底层调度器的时候是面向接口TaskScheduler的, 这符合面向对象中依赖抽象原则,带来底层资源调度器的可插拔性, 导致Spark可以运行在众多的资源高度器模式上。例如: Standalone, Yarn, Mesos, local. EC2 及其它自定义的资源调度器
  2. 在SparkContext实例化的时候通过createTaskScheduler来创建 TaskSchedulerImpl和StandaloneSchedulerBackend。在TaskSchedulerImpl的initialize方法中把StandaloneSchedulerBackend 传进来从而赋值给TaskSchedulerImpl的backend;在TaskSchedulerImple调用start方法的时候会调用 backend.start方法。
  3. TaskScheduler的核心任务是提交TaskSet到集群运算并汇报结果
  4. TaskScheduler 内部会握有 SchedulerBackend,从 Standalone 的模式来讲,具体实现是 StandaloneSchedulerBackend。
  5. StandaloneSchedulerBackend 在启动的时候创建 StandaloneAppClient 实例并在该实例Start的时候启动了 ClientEndpoint 这个消息循环体,ClientEndpoint 在启动的时候会向Master注册当前程序。而 StandaloneSchedulerBackend 的父类 CoarseGrainedSchedulerBackend 在 start 的时候会实例化类型为 DriverEndpoint 的消息循环体。StandaloneSchedulerBackend 专门负责收集 Worker 上的资源信息。当 ExecutorBackend 启动的时候会发送 RegisteredExecutor 信息向 DriverEndpoint 注册。此时StandaloneSchedulerBackend 就掌握了当前应用程序拥有的计算资源,就是通过 StandaloneSchedulerBackend 拥有的计算资源来具体运行 Task。

SparkContext、DAGScheduler、TaskSchedulerImpl、StandaloneSchedulerBackend 在应用程序启动的时候只实例化一次,应用程序存在期间始终存在这些对象。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3147257/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
管理员

注册时间:2018-03-30

  • 博文量
    2383
  • 访问量
    983935