一、宽依赖和窄依赖
1. 窄依赖
窄依赖(Narrow Dependency):指父RDD的每个分区只被子RDD的一个分区所使用,例如map、filter等这些算子。
一个RDD,对它的父RDD只有简单的一对一的关系,也就是说,RDD的每个partition仅仅依赖于父RDD中的一个partition,父RDD和子RDD的partition之间的对应关系,是一对一的。
2.宽依赖
宽依赖(Shuffle Dependency):父RDD的每个分区都可能被子RDD的多个分区使用,例如groupByKey、reduceByKey,sortBykey等算子,这些算子其实都会产生shuffle操作
也就是说,每一个父RDD的partition中的数据都可能会传输一部分到下一个RDD的每个partition中。此时就会出现,父RDD和子RDD的partition之间,具有错综复杂的关系,那么,这种情况就叫做两个RDD之间是宽依赖,同时,他们之间会发生shuffle操作。
以单词计数案例来分析

- 最左侧是linesRDD,这个表示我们通过textFile读取文件中的数据之后获取的RDD,接着是我们使用flatMap算子,对每一行数据按照空格切开,然后可以获取到第二个RDD,这个RDD中包含的是切开的每一个单词
- 在这里这两个RDD就属于一个窄依赖,因为父RDD的每个分区只被子RDD的一个分区所使用,也就是说他们的分区是一对一的,这样就不需要经过shuffle了。
- 接着是使用map算子,将每一个单词转换成(单词,1)这种形式,此时这两个RDD也是一个窄依赖的关系,父RDD的分区和子RDD的分区也是一对一的
- 最后我们会调用reduceByKey算子

文章详细解释了Spark中的宽依赖和窄依赖概念,窄依赖允许父RDD的每个分区只被一个子RDD分区使用,而宽依赖则涉及多个分区。在遇到宽依赖时,Spark会划分Stage,每个Stage由一组并行Task组成。Stage的划分从后往前,遇到shuffle操作(即宽依赖)就创建新的Stage,但执行时从前往后。通过一个实例分析了RDD之间的依赖关系和Stage的划分过程。

1721

被折叠的 条评论
为什么被折叠?



