2.1整体架构:
任务调度的两大模块:DAGScheduler(负责划分为不同阶段)和TaskScheduler(将不同阶段的TaskSet提交到集群中的Executor),Executor执行后的结果返回给Driver
2.2Scheduler的实现:
1)org.apache.spark.scheduler.DAGScheduler
2)org.apache.spark.scheduler.SchedulerBackend(trait)
分配当前可用的资源,具体就是向当前等待分配计算资源的Task分配计算资源(Executor),并且在分配的Executor上启动Task,完成计算的调度,org.apache.spark.scheduler.CoarseGrainedSchedulerBackend,YARN,Standalone,Mesos都是基于它并加入了自身的逻辑,
3)org.apache.spark.scheduler.TaskScheduler(trait):调度任务,即从DAGScheduler接收不同Stage的任务,并提交到不同的Executor,“慢任务”处理机制。
org.apache.spark.scheduler.SchedulerBackend#reviewOffers调用场景:
1)有新任务提交时
2)有任务执行失败时
3)计算节点(Executor不可用)时
4)某些任务执行过慢而需要为其重新分配资源时
SchedulerBackend与应用选择的Deploy Mode有关(部署方式包括local,master,yarn,mesos),SchedulerBackend->TaskScheduler(oneto one)
任务调度逻辑图:
Client端:
1)生成Job(Application执行Action算子,封装Job)
2)DAGScheduler划分多个Stage(ShufferMapStage和ResulStage,根据RDD之间的宽依赖(父RDD的partition对应于多个子RDD的partition))
3)DAGScheduler提交Stage
4)DAGScheduler为需要计算的Partition生成TaskSet
5)TaskScheduler提交计算任务
6)调度器SchedulableBuilder调度任务
7)TaskScheduler为任务分配资源
8)SchedulerBackend将任务提交到Executor运行
4.2 DAGScheduler实现详解
DAGScheduler划分的不同Stage的每个Partition上执行的Task逻辑完全相同,并封装成相应的TaskSet
4.2.1 DAGScheduler和TaskScheduler的创建
taskSch