spark内核揭秘-10-RDD源码分析

RDD的核心方法:

spark内核揭秘-10-RDD源码分析_第1张图片

spark内核揭秘-10-RDD源码分析_第2张图片

spark内核揭秘-10-RDD源码分析_第3张图片

spark内核揭秘-10-RDD源码分析_第4张图片

spark内核揭秘-10-RDD源码分析_第5张图片

首先看一下getPartitions方法的源码:

spark内核揭秘-10-RDD源码分析_第6张图片

getPartitions返回的是一系列partitions的集合,即一个Partition类型的数组

我们就想进入HadoopRDD实现:

spark内核揭秘-10-RDD源码分析_第7张图片

1、getJobConf():用来获取job Configuration,获取配置方式有clone和非clone方式,但是clone方式 是not thread-safe,默认是禁止的,非clone方式可以从cache中获取,如cache中没有那就创建一个新的,然后再放到cache中

2、进入 getInputFormcat(jobConf)方法:

spark内核揭秘-10-RDD源码分析_第8张图片

3、进入inputFormat.getSplits(jobConf, minPartitions)方法:

spark内核揭秘-10-RDD源码分析_第9张图片

进入FileInputFormcat类的getSplits方法:

spark内核揭秘-10-RDD源码分析_第10张图片

spark内核揭秘-10-RDD源码分析_第11张图片

spark内核揭秘-10-RDD源码分析_第12张图片

5、进入HadoopPartition:

spark内核揭秘-10-RDD源码分析_第13张图片

 

而getDependencies表达式RDD之间的依赖关系,如下所示:

spark内核揭秘-10-RDD源码分析_第14张图片

getDependencies返回的是依赖关系的一个Seq集合,里面的Dependency数组中的下划线是类型的PlaceHolder

我们进入ShuffledRDD类中的getDependencies方法:

我们进入ShuffleDependency类:

spark内核揭秘-10-RDD源码分析_第15张图片

每个RDD都会具有计算的函数,如下所示:

spark内核揭秘-10-RDD源码分析_第16张图片

我们进入HadoopMapPartitionsWithSplitRDD的 compute方法:

spark内核揭秘-10-RDD源码分析_第17张图片

Compute方法是针对RDD的每个Partition进行计算的,其TaskContext参数的源码如下:

spark内核揭秘-10-RDD源码分析_第18张图片

getPreferredLocations是寻找Partition的首选位置:

spark内核揭秘-10-RDD源码分析_第19张图片

我们进入NewHadoopRDD的getPreferredLocations:

spark内核揭秘-10-RDD源码分析_第20张图片

 

其实RDD还有一个可选的分区策略:

spark内核揭秘-10-RDD源码分析_第21张图片

Partitioner的源码如下:

spark内核揭秘-10-RDD源码分析_第22张图片

spark内核揭秘-10-RDD源码分析_第23张图片

spark内核揭秘-10-RDD源码分析_第24张图片

spark内核揭秘-10-RDD源码分析_第25张图片

可以看出默认使用的是HashPartitioner,要注意key为Array的情况;

spark.default.parallelism必须要设置,否则会根据partitions数据来传输RDD,这样也会很容易出现OOM

你可能感兴趣的:(RDD,compute,getPartitions,getDependencies)