前言
上期讲解了 Spark RDD 核心结构及其概念,本期详细讲一讲 Spark RDD 依赖关系的内容。
学习目标
- RDD 的依赖关系
- 如何区分宽窄依赖
- 为何设计要宽窄依赖
RDD的依赖关系
在 Spark 中,RDD 分区的数据不支持修改,是只读的。如果想更新 RDD 分区中的数据,那么只能对原有 RDD 进行转化 *** 作,也就是在原来 RDD 基础上创建一个新的RDD。
那么,在整个任务的运算过程中,RDD 的每次转换都会生成一个新的 RDD,因此 RDD 们之间会产生前后依赖的关系。
说白了,就是相当于将对原始 RDD 分区数据的整个运算进行了拆解,当运算中出现异常情况导致分区数据丢失时,Spark 可以还通过依赖关系从上一个 RDD 中重新计算丢失的数据,而不是对最开始的 RDD 分区数据重新进行计算。
在 RDD 的依赖关系中,我们将上一个 RDD 称为父RDD,下一个 RDD 称为子RDD。
如何区分宽窄依赖
RDD 们之间的依赖关系,也分为宽依赖和窄依赖。
- 宽依赖 :父 RDD 中每个分区的数据都可以被子 RDD 的多个分区使用(涉及到了shuffle);
- 窄依赖 :父 RDD 中每个分区的数据最多只能被子 RDD 的一个分区使用。
说白了,就是看两个 RDD 的分区之间,是不是一对一的关系,若是则为窄依赖,反之则为宽依赖。
有个形象的比喻,如果父 RDD 中的一个分区有多个孩子(被多个分区依赖),也就是超生了,就为宽依赖;反之,如果只有一个孩子(只被一个分区依赖),那么就为窄依赖。
常见的宽窄依赖算子:
- 宽依赖的算子 :groupByKey、partitionBy、join(非hash-partitioned);
- 窄依赖的算子 :map、filter、union、join(hash-partitioned)、mapPartitions、mapValues;
为何设计要宽窄依赖
从上面的分析,不难看出,在窄依赖中子 RDD 的每个分区数据的生成 *** 作都是可以并行执行的,而在宽依赖中需要所有父 RDD 的 Shuffle 结果完成后再被执行。
在 Spark 执行作业时,会按照 Stage 划分不同的 RDD,生成一个完整的最优执行计划,使每个 Stage 内的 RDD 都尽可能在各个节点上并行地被执行。
如下图,Stage3 包含 Stage1 和 Stage2,其中, Stage1 为窄依赖,Stage2 为宽依赖。
因此,划分宽窄依赖也是 Spark 优化执行计划的一个重要步骤,宽依赖是划分执行计划中 Stage 的依据,对于宽依赖必须要等到上一个 Stage 计算完成之后才能计算下一个阶段。
以上是本期分享,如有帮助请 点赞+关注+收藏 支持下哦~
下期继续讲解 RDD 内容。
往期精彩内容回顾:
1 - Spark 概述(入门必看)
2 - Spark 的模块组成
3 - Spark 的运行原理
4 - RDD 概念以及核心结构
5 - Spark RDD 的宽窄依赖关系
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)