spark源码走读之DAGSchedule
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 如果stage创建成功,则新建一个ActiveJob • if (finalStage != null) { val job = new ActiveJob(jobId, finalStage, func, partitions, callSite, listener, properties) clearCacheLocs() …… • 然后判断是否可以进行本地运行,如果可以则本地开始运行该 job,如果不行,则将该job转换为Activejob,并且启动sparker 的监听服务,最后提交submitStage(finalStage) • JobSubmitted最后做submitWaitingStages()操作
• 其中包含了sparkcontext,taskscheduler, mapOutputTracker跟踪已完成RDD输出情况,主要用户恢 复错误。
• DAGScheduler中会记录每一个RDD的分区的cache的位置。以 map形式记录,其中key为RDD的ID,value是array[分区号],每 一个array都是RDD分区被缓存的位置列表。 • private val cacheLocs = new HashMap[Int, Array[Seq[TaskLocation]]] • 我们使用MapOutputTracker‘s epoch number来跟组失败的节点, 每一个task都设置epoch number, When we detect a node failing, we note the current epoch number and failed // executor, increment it for new tasks, and use this to ignore stray ShuffleMapTask results。 • 创建一个线程池,用来调度命令,在一定的延迟之后执行命令, 或者在特定的时间来执行命令。 • eventProcessLoop---最重要的一块。 • eventLoop Thread, 会不断的从eventQueue中获取event并处理 • eventQueue, 所有需要DAGScheduler处理的事情都需要往 eventQueue中发送event
JobSubmitted中的类ActiveJob介绍
• Tracks information about an active job in the DAGScheduler. • 其中的参数和newStage函数中的参数一致。
JobSubmitted中的方法submitStage介绍
• Submits stage, but first recursively submits any missing parents. • submitStage的处理流程如下: • 1:所依赖的stage是否都已经完成,如果没 有则先执行所依赖的Stage。 • 2:如果所有的依赖已经完成,则提交自身 所处的Stage。
JobSubmitted中的函数newStage介绍
• 用来创建一个stage,既可以是一个result stage,也可以是 part of the (re)-creation of a shuffle map stage in newOrUsedStage.该stage将和被提供的jobID关联。 Production of shuffle map stages should always use newOrUsedStage, not newStage directly. numTasks: Int,可以看做是partition的个数。在创建一个 stage之前,我们必须知道该stage需要从多少个partition读 入数据,这个值直接影响要创建多少个Task。 • Newstage还可以用来创建shuffle map stage。If a stage for the shuffleId existed previously so that the shuffleId is * present in the MapOutputTracker, then the number and location of available outputs are * recovered from the MapOutputTracker
JobSubmitted中的方法submitStage介绍
• if (!waitingStages(stage) && !runningStages(stage) && !failedStages(stage))
• 如果这个条件成立的话,则我们获取miss掉的也就是未提交的 stage列表。 val missing = getMissingParentStages(stage).sortBy(_.id) • 然后提交这些miss列表中的stage • getMissingParentStages(stage)通过图的遍历,来找出所依赖的所 有父stage。大体思路是:先判断RDD是否被访问,若没有被访问, 则加入到访问列表,然后获得该RDD的存放位置,再获取该RDD 的依赖,如果该stage不可用的话,加入到missing列表,如果是宽 依赖,则getShuffleMapStage,如果是窄依赖,则直接访问RDD。 最后返回missing列表。
DAGSchedule
李晓燕 574605698@qq.com
Fra Baidu bibliotek 简介
• 最高层的调度层,实现了stage-oriented调度。为每一个job 计算出一个DAG,并且去跟踪已经实现的RDD和stage,并 且为每一个job找到一个最小的调度去运行,然后将stages 封装为taskset提交给taskScheduler。DAGScheduler并且也 会去计算哪一个节点去运行一个task最适宜,并且会处理 由于shuffle阶段数据丢失的错误,这种情况下之前的 stages得重新提交。不是shuffle阶段丢失数据的错误由 taskscheduler处理。
eventProcessLoop
• The main event loop of the DAG scheduler • 在receive函数中匹配
JobSubmitted
• DAGSchedulerEvent接受到JobSubmitted事件后,则调用 handleJobSubmitted函数 • 该函数会新建stage
– finalStage = newStage(finalRDD, partitions.size, None, jobId, callSite) – New stage creation may throw an exception if, for example, jobs are run on a HadoopRDD whose underlying HDFS files have been deleted。
• 刚接触,很多问题理解的不深,希望大家共同探讨。
Thanks
注
• Stage划分完毕就已经明确了如下内容:
– 1:产生的stage需要从多少个partition中读取数据 – 2:产生的stage会生成多少个partition – 3:产生的stage是否属于shuffleMap类型
• 确认partition以决定需要产生多少不同的task,shuffleMap类 型判断来决定生成的Tak类型,在spark中共分两种task,分别 是shuffleMapTask和ResultTask