一、什么是宽依赖、窄依赖
Spark中RDD的高效与DAG(有向无环图)有着莫大的关系,在DAG调度中我们需要对计算过程划分stage,而划分依据就是RDD之间的依赖关系。针对不同的转换函数,RDD之间的依赖关系分为宽依赖和窄依赖。那么到底什么是宽依赖和窄依赖的?
1、宽依赖:是指1个父RDD分区对应多个子RDD的分区
2、窄依赖:是指一个或多个父RDD分区对应一个子RDD分区
简单的说就是我们在数学中的映射关系
宽依赖就是1对多,窄依赖就是一对一或者多对一。如图:
二、区别
由上面的图我们很容易看出他们的区别,窄依赖父RDD的每个分区只被子RDD的一个分区所使用,宽依赖父RDD的每个分区都可能被多个子RDD分区所使用
在此将其分为两种模式,一定有其利弊情况,接在来我们简单聊一下。
首先根据我们上面的理解知道窄依赖是将其聚合到一起,收拢数据,这样我们就可以考虑到我们的一些算子就做此功能比如:map, filter, union, join(父RDD是hash-partitioned ), mapPartitions, mapValues;
而宽依赖则不同,宽依赖将其数据进行打散分开,走shuffle机制与mapreduce相同。他主要将一些数据进行洗牌和重新分组发牌。这里也有一些算子做此功能:groupByKey, join(父RDD不是hash-partitioned ), partitionBy,sort