spark2.2.0源码学习过程记录:Day4

1、读《apache spark 源码剖析》第四章第1节作业提交
我也使用简单的WordCount例子sc.textFile("/hdfs-site.xml").flatMap(line=>line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)来学习

2、源码学习
把例子像书中一样分成了几个子句,在命令行中敲了一下,看看转换的情况,和书中情况不太一样,因为版本不同
跟着书看了几个源码的类: RDD、PairRDDFunctions等
先看跟着书中的几行编码看一下相应的代码,最后总体看一下RDD等类的代码,这几个类中定义了操作RDD的相关方法,比如filter、map、flatMap、reduceByKey等

3、读《apache spark 源码剖析》第四章第2.1节依赖性分析及Stage划分,2.2节Actor Model和Akka
因为2.2节的内容我并不太关心,所以一起读了

4、源码学习
先把书中内容消化一下,把我自己的例子带入窄依赖、宽依赖的模型,确定一下stage(flatMap、map都是窄依赖,最后的reduceByKey是宽依赖,所以整个语句只有一个stage)。
提交的入口在SparkContext类的runJob方法,中,调用了dagScheduler的runJob方法,下面看一下dagScheduler类

类org.apache.spark.scheduler.DAGScheduler
这个类的类注释写的非常清楚,书上的基本和这个一致
使用AtomicInteger来维护jobid和stageid
runJob方法调用了submitJob方法,返回了一个jobWaiter,用来等待任务完成
submitJob方法:判断partitions有效,获取唯一jobId,创建jobWaiter,向eventProcessLoop提交JobSubmitted事件,返回jobWaiter
eventProcessLoop接收到JobSubmitted事件后调用DAGScheduler的handleJobSubmitted方法
handleJobSubmitted方法:
调用createResultStage方法创建finalStage
在这个方法里首先调用getOrCreateParentStages方法创建这个stage的父stage集合
使用了getOrCreateParentStages方法,这个方法里先调用了ShuffleDependencies方法取得了这个rdd的所有直接的ShuffleDependency,然后调用getOrCreateShuffleMapStage方法为每个ShuffleDependency创建了一个ShuffleMapStage。在getOrCreateShuffleMapStage中,会使用getMissingAncestorShuffleDependencies方法类似递归地取得所有间接的ShuffleDependency。然后为所有这些ShuffleDependency调用createShuffleMapStage方法创建ShuffleMapStage。
父stage集合创建完毕后,创建了一个ResultStage
这个ResultStage作为finalStage返回
使用这个finalStage创建一个ActiveJob //这个时候有点乱了,再看一下这一节的书
调用submitStage方法提交finalStage,Submits finalStage, but first recursively submits any missing parents,所有的找到没有missing parents的stage,执行submitMissingTasks方法,这个方法是书中下一节所讲的,先看下一节书

小细节:
在上面注释中说有点乱了的时候,确实有疑惑,感觉getOrCreateParentStages、ShuffleDependencies、getOrCreateShuffleMapStage、getMissingAncestorShuffleDependencies这几个类在重复调用,像死循环一样,最后在本子上把这些代码摘到了一起,用一个例子自己一步一步分析,最后弄明白了调用顺序,也许方法比较笨,但是动手实践一下测试一下效果很好


你可能感兴趣的:(spark2.2.0源码学习)