4.3 Spark Task 级别调度
Spark Task 的调度是由TaskScheduler
来完成,由前文可知,DAGScheduler
将Stage
打包到TaskSet
交给TaskScheduler
,TaskScheduler
会将TaskSet
封装为TaskSetManager
加入到调度队列中,
TaskSetManager
结构如下图所示。
前面也提到,TaskScheduler
初始化后会启动SchedulerBackend
,它负责跟外界打交道,接收Executor
的注册信息,并维护Executor
的状态,所以说SchedulerBackend
是管“粮食”的,同时它在启动后会定期地去“询问”TaskScheduler
有没有任务要运行,也就是说,它会定期地“问”TaskScheduler
“我有这么余量,你要不要啊”,TaskScheduler
在SchedulerBackend
“问”它的时候,会从调度队列中按照指定的调度策略选择TaskSetManager
去调度运行,大致方法调用流程如下图所示:
将TaskSetManager
加入rootPool
调度池中之后,调用SchedulerBackend
的riviveOffers
方法给driverEndpoint
发送ReviveOffer
消息;driverEndpoint
收到ReviveOffer
消息后调用makeOffers
方法,过滤出活跃状态的Executor
(这些Executor
都是任务启动时反向注册到Driver
的Executor
),然后将Executor
封装成WorkerOffer
对象;准备好计算资源(WorkerOffer
)后,taskScheduler
基于这些资源调用resourceOffer
在Executor
上分配task
。