开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:Spark 原理_逻辑图_宽窄依赖判断】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/12017
Spark 原理_逻辑图_宽窄依赖判断
内容简介
一、判断是否有 shuffle 的技巧
二、判断宽窄依赖步骤
三、源码判断
四、宽窄依赖判断依据总结
接下里会介绍款窄依赖如何分辨,什么时候是宽依赖,什么时候是窄依赖,宽窄依赖的分辨只有一种方式:是否含有 shuffle,看是否有 shuffle 有一些技巧
一、判断是否有 shuffle 的技巧
举例
1.笛卡尔积
例如 RddC 的p1 看似依赖了两个分区,但这两个分区并不在同一个 rdd 中, rddC 中的 p1 依赖了 rddA 中的一个分区 p1,和rddB 中的一个分区 p1,所以可以说 rddC 来源于一个分区。
2.ReduceByKe
例如 rddB 中的 p1 分区,依赖了 rddA 中的三个分区 p1、p2、p3,依赖了多个分区。
判断标准
Shuffle 的子 RDD 中的分区与父 RDD 之间的分区是一对一,还是多对一
结论
如果两个分区之间是一对一的关系,那么这两个分区之间是窄依赖关系
如果两个分区之间是多对一的关系,那么这两个分区之间是宽依赖关系
如图两个分区是一对一,绝对是窄依赖
如图两个分区间是分发的关系,需要通过经验判断,极有可能是宽依赖
两个分区之间一对一,绝对是窄依赖;多对一并不一定是宽依赖
二、判断宽窄依赖步骤
1. 看是否是一对一关系,是一对一,那么就是窄依赖
2. 不是一对一,而是多对一,不能确定
3. 看两个 RDD 的分区之间是单纯的数据流动,还是分发的复制,窄依赖是单纯的数据流动,而宽依赖则是分发和复制
如图这种情况是窄依赖
这种情况属于宽依赖
但是这样判断其实不准确,如果想分辨某个算子是否是窄依赖,或者是否是宽依赖,则还是要取决于具体的算子。
三、算子判断
例如,1.判断 cartesian 算子生成的 RDD 是宽依赖或窄依赖
直接点击进入生成的 cartesianRDD 中,找到 dependence,如下:
2. 判断 map 算子生成的 RDD 是宽依赖还是窄依赖
(1)点击进入 map 算子,可以看到生成的 mappartitionRDD,点击进入
// mappartitionRDD 是宽依赖还是窄依赖就在其 rdd 中定义
(2)可以看到没有 dependence,这说明是在 RDD 的父类中,点击进入 RDD,可以看到父类里有一个构造函数(mappartition 的构造函数)
(3)点击进入 this,可以看到在之前构造中传的 dependency 列表
(4)可以看到主构造里的 list 传了一个 OneToOneDependency,点击进入可以看到继承了 NarrowDependency,所以默认 dependency 就是 narrowdependency,
如果 RDD 没有继承 getdepenency,返回新的 dependency,那么这个 RDD 就是窄依赖(onetoone)
四、宽窄依赖判断依据总结
1. 如果分区间一对一,就是窄依赖
2. 如果分区是多对一,要看看是否有数据分发,有就是 shuffle
3. 最准确的判断方式是看源码