Spark RDD的依赖关系
- RDD之间的依赖关系分为两种,分别是NarrowDependency与ShuffleDependency,其中ShuffleDependency为子RDD的每个Partition都依赖于父RDD的所有Partition,而NarrowDependency则只依赖一个或部分的Partition。下图的groupBy与join操作是ShuffleDependency,map和union是NarrowDependency。
- 窄依赖(narrow dependencies):
子RDD的每个分区依赖于常数个父分区(与数据规模无关)
输入输出一对一的算子,且结果RDD的分区结构不变。主要是map/flatmap
输入输出一对一的算子,但结果RDD的分区结构发生了变化,如union/coalesce
从输入中选择部分元素的算子,如filter、distinct、substract、sample - 宽依赖(wide dependencies):
子RDD的每个分区依赖于所有的父RDD分区
对单个RDD基于key进行重组和reduce,如groupByKey,reduceByKey
对两个RDD基于key进行join和重组,如join
经过大量shuffle生成的RDD,建议进行缓存。这样避免失败后重新计算带来的开销。
注意:reduce是一个action,和reduceByKey完全不同。
这是社区说明图片
接下来看我们的举例说明
- 我们看到了,在上述的RDD lineage(家族) 中pairRDD 之前,pairRDD中的partition它的父RDD (wordsRDD)中的 parttion是一一对应的,wordsRDD中的某一个partition和它的父RDD(linesRDD)中的partition是一一对应的,那么也就是说,子RDD中的一个partition的数据只来源于父RDD中的相应的一个partition,而且这个父partition也只能去这个子partition,我们把这种RDD之间的关系称之为窄依赖(Narrow Dependency)
- 和窄依赖相对应的,就是说子RDD中的某一个partition中的数据都要从父RDD中的所有的partition中拉取,也就是说每一partition都依赖于父RDD中所有partition,我们把这种RDD的依赖关系称之为宽依赖(Shuffled Dependency 或者 Wide Dependency)
窄依赖:父子RDD partition的对应关系: 1 : 1
宽依赖: 父子RDD partition的对应关系: 1:N
Spark Application Stage 的划分算法: 从action 往前走遇到一个宽依赖,就是一个stage,stage从stage0开始