依赖关系
RDD会不断进行转换处理,得到新的RDD
每个RDD之间就产生了依赖关系
窄依赖
一个Stage内部的计算都是窄依赖的过程,全部在内存中完成
定义:父RDD的一个分区的数据给子RDD的一个分区【不需要调用Shuffle的分区器】
特点:
- 一对一 或者 多对一
- 不经过Shuffle,性能相对较快
- 无法实现全局分区、排序和分组等
示例:
宽依赖
Spark的job中按照宽依赖来划分Stage
定义:父RDD的一个分区数据给子RDD的多个分区【需要调用Shuffle的分区器来实现】
特点:
- 一对多
- 必须经过Shuffle,性能相对较慢
- 可以实现全局分区、排序和分组
示例:
【了解】为什么要设计宽窄依赖
提高数据容错的性能,避免分区数据丢失时,需要重新构建整个RDD
- 场景:如果子RDD的某个分区的数据丢失
- 无标记:不清楚父RDD与子RDD数据之间的关系,必须重新构建整个父RDD所有数据
- 有标记:父RDD一个分区只对应子RDD的一个分区,按照对应关系恢复父RDD的对应分区即可
提高数据转换的性能,将连续窄依赖操作使用同一个Task都放在内存中直接转换
- 场景:如果RDD需要多个map、flatMap、filter、reduceByKey、sortByKey等算子的转换操作
- 无标记:每个转换不知道会不会经过Shuffle,都使用不同的Task来完成,每个Task的结果要保存到磁盘
- 有标记:多个连续窄依赖算子放在一个Stage中,共用一套Task在内存中完成所有转换,性能更快