(七)Spark源码理解之TaskScheduler----part2

来源:互联网 发布:数据定义语言包括什么 编辑:程序博客网 时间:2024/06/07 02:37

2. TaskSetManager

TaskSetManager任务集管理器,负责管理为stage生成的任务集,是任务调度中比较重要的一个部分,包括如何查找任务,对TaskSchedulerImpl的任务分配做出回应,它有几个重要的变量:

pendingTasksForExecutor---在一个executor上执行的任务,用HashMap存储,key值为executor的id,value为一个列表,列表中存储的是该executor上运行的任务的id;

pendingTasksForHost---在主机上执行的任务,用HashMap存储,key值为主机,value为一个列表,列表中存储的是该主机上运行的任务的id;

pendingTasksForRack---在同一机架上执行的任务,用HashMap存储,key值为机架,value为一个列表,列表中存储的是该机架上运行的任务的id;

allPendingTasks---将所有的任务的id存储在ArrayBuffer中;

其中任务的优先位置顺序为:同一executor,同一host,同一机架,任何位置都可以。这点在接下来的方法中会有所体现

TaskSetManager有几个重要的方法,如查找任务,处理任务返回的结果(调用DAGScheduler的相应方法实现),处理成功,失败的任务(调用DAGScheduler的taskEnded方法,TaskSetManager本身只是做一些更新或者标记操作,最核心的还是由DAGScheduler完成):

findTask:用来查找相应任务和其优先位置

<script src="https://code.csdn.net/snippets/644773.js"></script>

findTaskFromList:用来从指定的executor或者host等中返回装载没有失败的相应的任务的id,若找到了,则返回并且从pendingTasksForExecutor等中删除该任务

<script src="https://code.csdn.net/snippets/644776.js"></script>

resourceOffer:我认为这个方法就是TaskSetManager对正在分配任务的exectour所作出的回应,分配任务给executor是由TaskSchedulerImpl实现的,一般分配任务时就会调用TaskSetManager的该方法,意思就是TaskSchedulerImpl现在正在分配任务给executor了,需要TaskSetManager返回分配给该executor的任务描述,之后TaskSetManager做出回应,表明它已经知道了,接着做出相应动作返回任务描述,主要完成以下行为:

首先得出在当前时间下的优先位置--->使用findTask方法找到该executor,host下或者要装载的任务(我认为起初应该是所有的任务都根据它的Location挂在这个pendingTasksForExecutorpendingTasksForHost等之下,然后在之后指定任务给相应的executor时,先从executorpendingTasksForExecutor取任务,再从hostpendingTasksForHost去任务等等,这也就符合了前面所说的任务的优先运行位置为同一executor,同一host。。。。此外应该注意一个任务可以放在不同host的不同executor之下,因此不同executorpendingTasksForExecutor会有相同的任务,因此在之后TaskSchedulerImpl中的resourceOffer()方法中要先打乱WorkOffer的内容,就是为了避免一个任务重复在某个host中的某个executor下运行)--->生成taskId,taskInfo---->更新优先位置的索引和装载时间---->更新Pool(可以理解为线程池)的正在运行的任务的数目,且将该任务的taskId添加到正在运行的任务集中--->调用DAGScheduler的taskStarted方法开始执行任务---->返回该任务描述(包括taskId,executor的Id等等)

PS:简单讲述下源码中出现的index和taskId的区别,index是在pendingTasksForExecutor等列表中出现的序号,而taskId是通过调用resourceOffer方法生成的,taskId具有唯一性,和全局性,比如两个任务,任务1和任务2,任务1存储在pendingTasksForExecutor中,可能它的index为2,任务2存储在pendingTasksForHost中,可能它的index为1

这是个人的理解,不知道正确与否,希望各位小伙伴们能提出来不同的意见。。。

未完待续。。。





0 0
原创粉丝点击