详解 Spark RDD 的宽窄依赖关系

详解 Spark RDD 的宽窄依赖关系,第1张

详解 Spark RDD 的宽窄依赖关系

前言

上期讲解了 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 的宽窄依赖关系

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5700055.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存