Spark中的宽窄依赖详解

Spark中的宽窄依赖详解

[TOC]

概述

​ RDD之间有一系列的依赖关系,依赖关系又分为窄依赖和宽依赖

具体细节

  • 窄依赖

​ 父RDD和子RDD partition之间的关系是一对一的。或者父RDD一个partition只对应一个子RDD的partition情况下的父RDD和子RDD partition关系是多对一的。不会有shuffle的产生。父RDD一个分区去到子RDD的一个分区

  • 宽依赖

    父RDD与子RDD partition之间的关系是一对多。会有shuffle的产生。父RDD的一个分区的数据去到子RDD的不同分区里面。

其实区分宽窄依赖主要就是看父RDD的一个Partition的流向,要是流向一个的话就是窄依赖,流向多个的话就是宽依赖。看图理解:

宽窄依赖

宽窄依赖

算子的宽窄依赖

​ 对 RDD 进行 map、filter、union 等转换(Transformations)一般都是窄依赖

​ 宽依赖一般是对 RDD 进行 groupByKey,reduceByKey 等操作,就是对 RDD 中的 partition 中的数据进行重新分区(shuffle)

​ join 操作可能是宽依赖也可能是窄依赖,当要对 RDD 进行 join 操作时,如果对 RDD 进行过重分区则为窄依赖,否则为宽依赖。

常见算子

宽依赖:groupByKey、reduceByKey、aggregateByKey、join、cogroup、repartition、distinct

distinct源码

1
2
3
4
5
6
7
/**
* Return a new RDD containing the distinct elements in this RDD.
*/
def distinct(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] = withScope {
map(x => (x, null)).reduceByKey((x, y) => x, numPartitions).map(_._1)
}

窄依赖:map,fiter,union,flatMap

Spark的Stage划分


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!