Spark源码学习1.3——TaskSetManager.scala

TaskSetManager.scala

TaskSet是指一系列被提交的task,一般是代表特定的stage中丢失的partition。TaskSetManager通过一个TaskSchedulerImpl实体来对TaskSet进行管理。

该方法定义了以下参数:

EXECUTOR_TASK_BLACKLIST_TIMEOUT:executor加入黑名单的时间。如果executor意外终止导致任务执行失败,那么会暂时将这个executor加入黑名单,不再分配任务给它。

SPECULATION_QUANTILE和SPECULATION_MULTIPLIER:推测执行的分位点及推测执行的任务数量。

isZombie:首先,定义TaskSetManager进入zombie状态——TaskSet中至少有一个task运行完成或者整个taskset被抛弃;zombie状态会一直保持到所有的task都执行完成;之所以让TaskSetManager处于zombie状态,是因为这时可以跟踪所有正在运行的task。

pendingTasksForExecutor:Executor的未确定队列中的所有task。这些task实际上以堆的形式存放,新来的task存放在堆尾,而执行错误的任务则会放置在堆头,以此可以察觉重复执行失败的任务。并且这些task还只是简单的清除,当它确定分发给executor时,它只是从这个executor的未确定队列中清除,其他的executor的未确定队列中稍后才清除。类似的参数有pendingTasksForHost和pendingTasksForRack。PS. 在向pending list中插入task时一般是按照逆序,这样序号小的任务就先launch。

currentLocalityIndex和lastLaunchTime:用来定义当前的分配等级(根据数据本地性定义的优先级)以及当前等级下的任务launch的最迟时间。

该文件定义的方法如下:

1、addPendingTask():该方法依靠本地性优先级将task悬挂到对应的pending list中。

2、findTaskFromList():该方法获取list中一个可以launch的task,同时清除扫描过的已经执行的task。其实它从第二次开始首先扫描的一定是已经运行完成的task,因此是延迟清除。

3、executorIsBlacklisted():加入黑名单的executor是否可以运行task?

4、findSpeculativeTask():从指定的executor中获取可以推测执行的task,然后考虑其本地性优先级,并根据本地性优先级分配task。

5、findTask():获取指定节点指定优先级的队列中的task。如果所有的task都已经launch了,那么就查询可以推测执行的task。

6、resourceOffer():向一个只有一个executor的offer提供一个任务。这个方法可以被采用延迟调度的具有最大本地性优先级的任务,或者指定的不可修改的NO_PREF优先级的任务使用。

7、getAllowedLocalityLevel():根据延迟调度机制和等待时间获取可以launch的task的本地性优先级。

8、getLocalityIndex():修正错误的本地性优先级。

9、handleSuccessfulTask()和handleFailedTask():标记已经成功/失败的task,并向DAGScheduler发送同步消息。

10、maybeFinishTaskSet():标记执行完成的任务。

11、abort():将意外停止的任务(例如Mesos错误)标记为已完成任务,同时将TaskSetManager的状态置为isZombie。

12、addRunningTask()和removeRunningTask():添加/删除正在运行的任务。

13、executorLost():如果executor丢失,那么所有的任务都需要重新在其他的executor上再执行一遍,并通知DAGScheduler这个stage运行失败了。

14、checkSpeculatableTasks():判断某个任务是否可以启动推测执行。一,该任务必须可以推测执行;二,在大多数任务执行完成后才启动推测执行机制;三,达到门槛值的task放入推测执行任务等待队列中。该方法返回的值是布尔型,表明存在推测执行的任务。

15、computeValidLocalityLevels():假定所有的任务都已经添加到了pending list中,此时调用该方法计算该TaskSet中所有任务的本地性优先级的使用情况。

16、recomputeLocality():重新计算本地性优先级使用情况,主要是在添加executor后调用。

时间: 2024-07-30 22:07:28

Spark源码学习1.3——TaskSetManager.scala的相关文章

Spark源码学习1.1——DAGScheduler.scala

本文以Spark1.1.0版本为基础. 经过前一段时间的学习,基本上能够对Spark的工作流程有一个了解,但是具体的细节还是需要阅读源码,而且后续的科研过程中也肯定要修改源码的,所以最近开始Spark的源码的学习.首先以重要文件为基础分别分析,然后再整体的分析. (一)DAGScheduler.scala文件的主要功能 DAGScheduler是划分Job为stage的调度,它是在作业所需要的数据已经被分为RDD之后执行的.DAGScheduler将Job划分为DAG图,以stage为图的结点,

Spark源码学习1.6——Executor.scala

Executor.scala 一.Executor类 首先判断本地性,获取slaves的host name(不是IP或者host: port),匹配运行环境为集群或者本地.如果不是本地执行,需要启动一个handler来监控所有的executor进程,避免阻塞.然后,初始化Spark执行环境.向SparkEnv注册executor资源,即registerSource方法.第三步,装载类,序列化类到内存中.第四,启动worker的线程池.第五,收集所有的task任务.接下就可以分配资源给task了,

Spark源码学习1.4——MapOutputTracker.scala

相关类:MapOutputTrackerMessage,GetMapOutputStatuses extends MapPutputTrackerMessage,StopMapOutputTracker extends MapOutputTrackerMessage,MapOutputTrackerMasterActor,MapOutputTrackerMaster. 首先重写MapOutputTrackerMasterActor的receiveWithLogging:判断MapOutputTr

Spark源码学习1.5——BlockManager.scala

一.BlockResult类 该类用来表示返回的匹配的block及其相关的参数.共有三个参数: data:Iterator [Any]. readMethod: DataReadMethod.Value. bytes: Long. 实例化InputMetrics类. 二.BlockManager类 关系的参数有executorId,blockManagerMaster,mapOutPutTracker等.关系的类有ShuffleBlockManager类,DiskBlockManager类,Co

Spark源码学习和总结1

一. Spark源码编译 解析: wget http://archive.apache.org/dist/spark/spark-1.6.0/spark-1.6.0-bin-hadoop2.6.tgz gtar -zxvf spark-1.6.0-bin-hadoop2.6.tgz cd spark-1.6.0-bin-hadoop2.6 ./sbt/sbt gen-idea 说明:漫长的等待后,上述命令生成SBT工程,我们就可以使用IDEA以SBT Project的方式打开. 二. RDD实现

Spark源码学习2

转自:http://www.cnblogs.com/hseagle/p/3673123.html 在源码阅读时,需要重点把握以下两大主线. 静态view 即 RDD, transformation and action 动态view 即 life of a job, 每一个job又分为多个stage,每一个stage中可以包含多个rdd及其transformation,这些stage又是如何映射成为task被distributed到cluster中 一.概要 本文以wordCount为例,详细说

spark源码学习-withScope

withScope是最近的发现版中新增加的一个模块,它是用来做DAG可视化的(DAG visualization on SparkUI) 以前的sparkUI中只有stage的执行情况,也就是说我们不可以看到上个RDD到下个RDD的具体信息.于是为了在 sparkUI中能展示更多的信息.所以把所有创建的RDD的方法都包裹起来,同时用RDDOperationScope 记录 RDD 的操作历史和关联,就能达成目标.下面就是一张WordCount的DAG visualization on Spark

Spark源码学习和总结2

2. SchedulerBackend SchedulerBackend是一个trait,主要的功能是向当前等待分配计算资源的Task分配计算资源Executor,并且在分配的Executor上启动Task,完成计算的调度过程.上述任务调度是通过方法def reviveOffers(): Unit实现的.需要说明的是CoarseGrainedSchedulerBackend是SchedulerBackend的一个具体实现,而YARN.Standalone和Mesos都是基于SchedulerBa

大数据Spark蘑菇云前传第15课:Scala类型参数编程实战及Spark源码鉴赏(学习笔记)

前传第15课:Scala类型参数编程实战及Spark源码鉴赏 本課課程: Spark源码中的Scala类型系統的使用 Scala类型系統编程操作实战 Spark源码中的Scala类型系統的使用 classOf[RDD[_]] 這個也是类型系統 這里的意思是說 B 這種類型必需至少是 A 這樣類型 Ordering Scala类型系統编程操作实战 作為類型系統最大的就可以對類型進行限制,在Scala 中的類型系統,他本身也作為對象.e.g. 我們可以建立 Person 這個類,現在可以建立一個什麼