Spark 原理_逻辑图_窄依赖的分类_分析 | 学习笔记

简介: 快速学习 Spark 原理_逻辑图_窄依赖的分类_分析

开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段Spark 原理_逻辑图_窄依赖的分类_分析】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/689/detail/12019


Spark 原理_逻辑图_窄依赖的分类_分析


内容简介

一、了解依赖类

二、一对一窄依赖

三、Range 窄依赖

四、多对一窄依赖

五、谈宽窄依赖的区别

 

一、了解依赖类

上节通过源码了解了依赖类的继承关系,从源码上看到依赖关系:

1.最顶级、外部的类叫做 dependency,其有两个直接子类:shuffledependencynarrowdependency

2.Narrowdependency 类含有两个子类:一对一窄依赖、range 窄依赖,以及一个逻辑窄依赖:一对多窄依赖

进入笔记中,有明确的窄依赖的三张图

 

二、一对一窄依赖

其实 RDD 中默认的是 onetoonedependency,后被不同的 RDD 子类指定为其他的依赖类型,常见的一堆依赖是 map 算子所产生的依赖,一对一窄依赖怎样会出现,例如 rddB = rddA.map(...)

// onetoonedependency 就是一对一窄依赖,在前面见到过,如果一个 RDD 的子类中,没有重写 getdependency 方法,rdd 默认的 dependency 返回的就是 onetoonedependency

image.png

每个分区之间一一对应,所以叫做一对一窄依赖,rddA p1 rddB p1 是一对一关系

 

三、Range 窄依赖

Range 窄依赖其实也是一对一窄依赖,但是保留了中间的分隔信息,可以通过某个分区获取其父分区,目前只有一个算子生成这种窄依赖,就是 union 算子,例如,rddC = rddA.union(rddB)

//Union 就是把两个集合合并,求其并集

image.png

接下里我们要做的就是将 rddA rddB union 起来

RddA 的第一个分区,对应了 rddC 中的第一个分区;RddA 的第二个分区,对应了 rddC 中的第二个分区;RddA 的第三个分区,对应了 rddC 中的第三个分区;rddB 中的第一个分区对应了 rddC 中的 p4rddB 中的第二个分区对应了 rddC 中的 p5,如图箭头所示

所以还是一对一依赖。

例如要通过 p4 了解父 rdd 是谁,那么这个时候要知道是 rddB 才行,所以就设定了一个边界,在 p3 p4 中间画了一条线,要记录 rddA 分区的 rdd 起始自那个下标,结束自那个下标,记录每个 rdd 在这个结果 rdd 中的 range,这称之为 range 窄依赖,本质上还是一对一,而且只在 union 中使用,所以我们简单了解一下。

1.RddC 其实就是 rddA 拼接 rddB 生成的,所以 rddC p1 p4,分别对应 rddA p1 rddB p1

2.所以需要有方式获取到 rddC p4 其父分区是谁,于是就需要记录以下边界,记录每个分区的 range,其他部分和一对一窄依赖一样


四、多对一窄依赖

多对一窄依赖相对来说不太好理解,但是我们也可以简单看一下,多对一窄依赖有非常明显的场景,coalesce(减少分区)

多对一窄依赖其图形和 shuffle 依赖非常相似,所以在遇到的时候,要注意其 RDD 之间是否有 shuffle 过程,比较容易让人困惑,常见的多对一依赖就是重分区算子 coalesce,常见的 rddB = rddA.coalesce(2,shuffle = false),但同时也要注意,如果 shuffle = true 那就是完全不同的情况了

image.png

1.当将三个分区减少为两个分区时,势必要合并其中两个分区,所以 coalesce 就是一对多依赖

2.右边(合并后)的 p3 依赖了左边的 p2 p3,这就是多对一关系

//因为 左边的 p2 p3 将数据都传到了 右边的 p3,这是多对一关系,p2 p3 将数据全部给 p3,不存在 shuffle 过程,所以这同样时窄依赖

//Coalesce 可以指定是否 shuffle,当指定不 shufflecoalesce 是不会生成 shuffle 依赖,只会生成窄依赖

 

五、谈宽窄依赖的区别

1.区别就是界定两个分区,是否可以放到同一流水线上执行

举例

(1)多对一窄依赖图例,如上图:

要计算右边 p1 的数据时,可以直接通过左边 p1 获得当要计算右边 p3 的数据时,直接通过左边的 p2p3获得,不需要p1 ,不存在 shuffle 过程,但中间需要算子计算。

(2)一对一窄依赖图例,如上图:

RddA 的 p1 rddB p1可以放在一个任务中运行,当需要 rddB p1 中的数据时,可以直接通过 rddA p1 进行过渡。

2.  划分宽窄依赖的核心区别是:窄依赖的RDD 中对应的分区可以放在一个 tesk 中运行

窄依赖的 rdd 的所有分区,假如有三个 rdd 是窄依赖关系,那么他们三个 rdd 的对应分区是可以放在一个 task 中去运行的,这是我们所说的窄依赖。

然而宽依赖并不适用,如下 reducebykey 例子:

image.png

计算 rddB p1 的数据,它依赖于 rddA 中的所有分区,需要将数据都计算好,一个一个获取,都计算好才能进行 shuffle,这是他们间的最大区别。

它们之间的最大区别就是:窄依赖的 rdd 可以放在一个 task 中运行。

相关文章
|
8月前
|
分布式计算 Spark
【赵渝强老师】Spark RDD的依赖关系和任务阶段
Spark RDD之间的依赖关系分为窄依赖和宽依赖。窄依赖指父RDD的每个分区最多被一个子RDD分区使用,如map、filter操作;宽依赖则指父RDD的每个分区被多个子RDD分区使用,如分组和某些join操作。窄依赖任务可在同一阶段完成,而宽依赖因Shuffle的存在需划分不同阶段执行。借助Spark Web Console可查看任务的DAG图及阶段划分。
345 15
|
12月前
|
SQL 分布式计算 Serverless
EMR Serverless Spark:一站式全托管湖仓分析利器
本文根据2024云栖大会阿里云 EMR 团队负责人李钰(绝顶) 演讲实录整理而成
617 58
|
8月前
|
SQL 分布式计算 Serverless
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
189 0
|
设计模式 数据采集 分布式计算
企业spark案例 —出租车轨迹分析
企业spark案例 —出租车轨迹分析
413 0
|
存储 缓存 分布式计算
大数据-89 Spark 集群 RDD 编程-高阶 编写代码、RDD依赖关系、RDD持久化/缓存
大数据-89 Spark 集群 RDD 编程-高阶 编写代码、RDD依赖关系、RDD持久化/缓存
145 4
|
分布式计算 Java 大数据
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
145 0
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
|
SQL 分布式计算 大数据
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
264 0
|
SQL 分布式计算 算法
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(二)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(二)
213 0
|
4月前
|
人工智能 分布式计算 大数据
大数据≠大样本:基于Spark的特征降维实战(提升10倍训练效率)
本文探讨了大数据场景下降维的核心问题与解决方案,重点分析了“维度灾难”对模型性能的影响及特征冗余的陷阱。通过数学证明与实际案例,揭示高维空间中样本稀疏性问题,并提出基于Spark的分布式降维技术选型与优化策略。文章详细展示了PCA在亿级用户画像中的应用,包括数据准备、核心实现与效果评估,同时深入探讨了协方差矩阵计算与特征值分解的并行优化方法。此外,还介绍了动态维度调整、非线性特征处理及降维与其他AI技术的协同效应,为生产环境提供了最佳实践指南。最终总结出降维的本质与工程实践原则,展望未来发展方向。
246 0
|
7月前
|
存储 分布式计算 Hadoop
从“笨重大象”到“敏捷火花”:Hadoop与Spark的大数据技术进化之路
从“笨重大象”到“敏捷火花”:Hadoop与Spark的大数据技术进化之路
322 79