spark源码分析之dependency

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/flyinthesky111/article/details/79387777

一、源码下载以及安装阅读
这部分可以看我写的第一个源码分析的开始,有说明,比较简单,附上链接http://blog.csdn.net/flyinthesky111/article/details/79379309
二、源码分析
打开org.apache.spark.Dependency.scala文件
整体看
首先Dependency实现了序列化
abstract class Dependency[T] extends Serializable {
def rdd: RDD[T]
}
其次Dependency有两个子类
1.NarrowDependency(窄依赖)
2.ShuffleDependency(宽依赖)
NarrowDependency类中就只有一个getParents方法,就是通过子分区获取到父分区
ShuffleDependency之下又有几个子类,分别是:OneToOneDependency,RangeDependency。
咱们先看一看NarrowDependency中有哪些东西
先看传的什么参数
(
private val rdd: RDD[ <: Product2[K, V]],
val partitioner: Partitioner,
val serializer: Serializer = SparkEnv.get.serializer,
val keyOrdering: Option[Ordering[K]] = None,
val aggregator: Option[Aggregator[K, V, C]] = None,
val mapSideCombine: Boolean = false
)
这些参数一一解释下:
第一个是父RDD
第二个用于做shuffle输出的的分区的分区器
第三个就是序列化,如果自己没有指定序列化方式,就会采用它默认的序列化方式
第五个是发生shuffle的RDD的聚合器
第六个表示是否进行部分合并
紧接着获取出了三个类名
这里写图片描述
这三个变量的应用在此处没有体现出来,但是作者给了一段注释,说是 当combineByKeyWithClassTag替代了combineByKey的时候,涉及到合并类的tag可能为空,所以这三个猜测应该是解决这个问题的
接着看
这里写图片描述
这new出一个shuffleid然后加上分区长度,和具体信息,通过shuffleManager的registerShuffle方法注册除了一个shuffle
OneToOneDependency
这就是一个父RDD和子RDD之间一对一关系的依赖,他也有几个参数对其进行描述
这里写图片描述
这四个参数中第一个是父RDD
第二个是父RDD开始的区域,第三个是子RDD开始的区域,最后一个是对这个区域长度的描述
自己重写了getParents方法 def getParents(partitionId: Int): List[Int] = List(partitionId)
把分区ID封装到一个List集合里
RangeDependency
参数同OneToOneDependency
不过他自己从重写了getParents方法
if (partitionId >= outStart && partitionId < outStart + length) {
List(partitionId - outStart + inStart)
} else {
Nil
}
加入了一个这样的判断,然后将计算后的分区ID封装到list中
至此spark依赖的源码粗略解读了。

展开阅读全文

没有更多推荐了,返回首页