spark任务的真正的运行时由action算子进行一个触发,最终调用sc.runJob方法,在driver端会初始化2个重要的组建DagScheduler和TaskScheduler
TaskScheduler的主要职责:
我们在阅读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的初始化过程如下:

初始化方法执行完毕后,将创建好的 (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 原理小结:
SparkContext、DAGScheduler、TaskSchedulerImpl、StandaloneSchedulerBackend 在应用程序启动的时候只实例化一次,应用程序存在期间始终存在这些对象。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3147257/ ,如需转载,请注明出处,否则将追究法律责任。