Spark中宽依赖和窄依赖的区别

一、什么是宽依赖、窄依赖

Spark中RDD的高效与DAG(有向无环图)有着莫大的关系,在DAG调度中我们需要对计算过程划分stage,而划分依据就是RDD之间的依赖关系。针对不同的转换函数,RDD之间的依赖关系分为宽依赖和窄依赖。那么到底什么是宽依赖和窄依赖的?

1、宽依赖:是指1个父RDD分区对应多个子RDD的分区

2、窄依赖:是指一个或多个父RDD分区对应一个子RDD分区

简单的说就是我们在数学中的映射关系

宽依赖就是1对多,窄依赖就是一对一或者多对一。如图:

Spark中宽依赖和窄依赖的区别

Spark中宽依赖和窄依赖的区别

Spark中宽依赖和窄依赖的区别

二、区别

由上面的图我们很容易看出他们的区别,窄依赖父RDD的每个分区只被子RDD的一个分区所使用,宽依赖父RDD的每个分区都可能被多个子RDD分区所使用

在此将其分为两种模式,一定有其利弊情况,接在来我们简单聊一下。

首先根据我们上面的理解知道窄依赖是将其聚合到一起,收拢数据,这样我们就可以考虑到我们的一些算子就做此功能比如:map, filter, union, join(父RDD是hash-partitioned ), mapPartitions, mapValues;

而宽依赖则不同,宽依赖将其数据进行打散分开,走shuffle机制与mapreduce相同。他主要将一些数据进行洗牌和重新分组发牌。这里也有一些算子做此功能:groupByKey, join(父RDD不是hash-partitioned ), partitionBy,sort