(一)DAGScheduler
dagScheduler会为每个job计算出它的Stage有向无环图(DAG),它会把每个stage作为1个tasksets提交到taskScheduler 然后将他们运行在集群当中,一个taskset包含多个task, (stage划分的阶段是在submitJob中将job提交到EventLoop的时候,在DAGScheduler当中有一个doOnReceive方法进行调用.=> handleJobSubmitted方法里会根据finalRDD创建一个final Stage, 这个final Stage的创建过程和对Stage的理解是相映射的,比如说final stage = createResultStage()方法中,会获取一个parents 类型为List[Stage],所以根据RDD和它的jobId来获取这个RDD的parentStage, 在这个获取parentStage的函数中有2个关键函数 第一个是getShuffleDependencies.这个函数做了一个逻辑就是创建一个Stack[RDD]的栈,它会先将传入的RDD入栈,然后出栈获取他对应的依赖, 如果是shuffleDep类型就将这个依赖放入一个HashSet当中,否则将窄依赖对应的RDD继续压入栈中(窄依赖的RDD入栈的用处举例:比如rdd3的父依赖是RangeDependenCy,那么会将中间2个RDD入栈,中间两个RDD的父依赖是ShuffleDependency这时会返回两个ShuffleDependency,这也是为什么会返回一个HashSet集合的原因). getShuffleDependencies(如果 A<-- B <-- C 那么只会返回B<-- C 的宽依赖)之后 就会对这个List[ShuffleDep]进行遍历来返回一个List[Stage] (根据DAGScheduler中的shuffleIdMapStage 这个Map[Int, ShuffleMapStage] 他只会包含当前running job 中的stage, 通过映射一个ShuffleDep的ShuffleId返回一个stage,如果没有返回,那么会通过getMissingAncestorShuffleDependencies方法获得一个dependency然后在getOrCreateShuffleMapStage中创建一个stage[没有返回应该是因为任务中断等特殊原因->参考checkpoint],Spark-13902论述了一种stage creation process会延时添加shuffle dependency,google没有查到该问题, 待解)
以上逻辑太乱, 重新整理一下
在我们提交job是这样的, DagScheduler会通过DAGSchedulerEventProcessLoop的父类EventLoop的post方法将job放进一个LinkedBlockingQueue里面(异步执行job), 然后DAGSchedulerEventProcessLoop便会启动一个线程来执行重写了EventLoop的OnReceive方法,在DAGScheduler里面我们可以查看到这个方法会触发handleJobSubmitted方法
讲到这里我理解到了RDD的惰性计算特性,在这里所有的方法传递的RDD 都是Final RDD.也就是说我们触发Action算子是通过传递FinalRDD来进行一系列的操作的.
handleJobSubmitted方法通过finalRDD来创建final Stage, 具体是先获得这个final stage的所有父stage,
获得父stage的过程比较复杂
1.
在这里建议先阅读一下Dependency的源码,了解到ShuffleDependency和NarrowDependenCy,然后每个dependency会对应一个RDD, RDD又会对应一个Seq[DependenCy]序列
先讲getShuffleDependencies根据finalRDD获取他的dependencies, 但是这个方法的源码说过 只会获取最近的一个shuffle dependency, 所以还能返回一个HashSet[ShuffleDependenCy]的原因是因为该RDD 的父依赖先是窄依赖(Union)这种,这样父依赖对应的RDD 都会入栈, 再通过他们去获得ShuffleDependenCy这样便获得了一个HashSet, 获取了HashSet后会遍历每个ShuffleDependency来获得ShuffleMapStage (PS:Stage只有ShuffleMapStage和ResultStage),
2.getOrCreateShuffleMapStage是个比较复杂的函数
主要聚焦在于shuffleIdToMapStage这个Map[Int,ShuffleMapStage]中 以及getMissingAncestorShuffleDependencies方法,
该方法会根据找不到Stage的这个shuffleDependency的RDD去获取这个RDD对应的所有ShuffleDependency 这样又调用了getShuffleDependencies方法又获得一个HashSet,又根据这个集合中的ShuffleDependency去查看shuffleIdToMapStage是否包含了对应的stage,要是没有就createShuffleMapStage.if()条件只是会创建所有父stage, 最后才会创建当前这个shuffleDependenCy的stage, 图1的finalRDD对应的所有ShuffleDependency都返回了相应的ShuffleMapStage
然后再回到这里 进行ResultStage方法的创建.
https://www.cnblogs.com/jcchoiling/p/6431969.html