(七)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挂在这个pendingTasksForExecutor,pendingTasksForHost等之下,然后在之后指定任务给相应的executor时,先从executor的pendingTasksForExecutor取任务,再从host的pendingTasksForHost去任务等等,这也就符合了前面所说的任务的优先运行位置为同一executor,同一host。。。。此外应该注意一个任务可以放在不同host的不同executor之下,因此不同executor的pendingTasksForExecutor会有相同的任务,因此在之后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
这是个人的理解,不知道正确与否,希望各位小伙伴们能提出来不同的意见。。。
未完待续。。。
- (七)Spark源码理解之TaskScheduler----part2
- (七)Spark源码理解之TaskScheduler----part1
- (七)Spark源码理解之TaskScheduler----part3
- (七)Spark源码理解之TaskScheduler----part4
- (七)Spark源码理解之TaskScheduler----part5
- (七)Spark源码理解之TaskScheduler----part6
- (四)Spark源码理解之BlockManager---part2
- (六)Spark源码理解之RDD----part2
- (八)Spark源码理解之DAGScheduler---part2
- Spark源码分析之Scheduler模块(TaskScheduler)
- Spark源码分析之Scheduler模块(TaskScheduler)
- Spark源码分析之Scheduler模块(TaskScheduler)
- spark源码学习(七)--- TaskScheduler源码分析
- Spark分析之TaskScheduler
- Spark Scheduler模块源码分析之TaskScheduler和SchedulerBackend
- spark源码之Job执行(2)任务调度taskscheduler
- Spark源码阅读笔记:TaskScheduler
- Spark源码解读-Taskscheduler源码解析
- xmpp学习笔记-基础
- Objective-C中获取类名
- 黑马程序员_日记46_TreeSet练习
- Eclipse默认的任务标签
- 最简单的基于FFMPEG的封装格式转换器(无编解码)
- (七)Spark源码理解之TaskScheduler----part2
- linux 发送邮件到外网方法
- 信息学(OI)竞赛—常用算法网站
- zeromq的发送队列长度的参数设置
- PHP实现HTML批量转TXT文件
- Wireshark基本介绍和学习TCP三次握手
- Activity之间传递数据
- Android 代码实现背景选择器
- 黑马程序员_异常