Spark ----driver executor运行图:
图 1-1 driver-----executor 运行图
-----TaskSetManager结构图:
图 1-2 TaskSetManager 结构
Spark Task的调度是由TaskScheudler来完成的,DAGScheduler将stage打包到taskSet并交给TaskScheduler,TaskScheduler会将TaskSet分装为TaskManager,加入到调度队列中。
TaskSetManager负责监控同一个stage中的tasks,TaskScheduler是以TaskManager为单元进行调度的。
TaskScheduler初始化之后,SchedulerBackend启动,SchedulerBackend会定时询问TaskScheduler有没有需要执行的task任务,TaskScheduler在SchedulerBackend询问它的时候会从调度队列中按照指定的调度策略选择TaskSetManager去调度运行。
----大致的方法调用流程如下图:
DAGScheduler划分stage之后将stages分发到TaskScheduler中,此时启动taskScheduler.submitTasks方法。
TaskScheduler中执行流程:
taskScheduler.submitTasks方法被调用提交taskSet,
根据taskSet的数量创建相应的TaskSetManager,
调用schedulableBuilder对象将创建的TaskManager放到TaskSetPool中。
然后就是调用schedulerBackend对象的reviveOffers方法,
此方法内部再调用makeOfficers方法,schedulerBackend查看可用的executor数量,
此时taskScheduler开始调用resourceOffers方法,记录用来执行每个task相应的executor容器,
最后rootPool对象调用getSortedTaskSetQueue方法来找到TaskSetPool中对应的task放到对应的executor中开始执行。