深度解读sparkRDD宽窄依赖

news/2024/12/1 18:41:28/
  1. RDD以及依赖关系介绍

    • RDD(弹性分布式数据集):是Spark的核心数据结构,它代表一个不可变、可分区、里面的元素可以并行计算的集合。RDD具有容错性,当某个分区的数据丢失时,可以通过转换操作的血缘关系重新计算得到。
    • 依赖关系:RDD之间存在依赖关系,这种依赖关系用于在某个RDD分区数据丢失或者需要重新计算时,能够从其依赖的RDD中重新生成数据。根据依赖关系的不同特点,分为宽依赖和窄依赖。
  2. 窄依赖(Narrow Dependency)

    • 概念:窄依赖是指父RDD的每个分区最多被一个子RDD分区使用。例如,map、filter等操作会产生窄依赖。
    • 特点
      • 计算高效:在进行计算时,窄依赖允许在一个计算节点上流水线式地执行多个转换操作。因为父RDD分区和子RDD分区是一对一或者多对一的关系,所以可以在一个节点上对分区数据连续进行处理,减少数据传输开销。
      • 故障恢复快:如果某个子RDD分区丢失,只需要重新计算该分区对应的父RDD分区即可。由于父RDD分区到子RDD分区的映射关系简单,重新计算的代价相对较小。
    • 图例
      在这里插入图片描述
      在这里插入图片描述
  3. 宽依赖(Wide Dependency)

    • 概念:宽依赖是指父RDD的一个分区可能被多个子RDD分区使用。例如,groupByKey、reduceByKey等操作会产生宽依赖。
    • 特点
      • 数据混洗(Shuffle):宽依赖通常会涉及到数据的混洗。因为父RDD的一个分区数据要被多个子RDD分区使用,所以需要对数据进行重新分区和传输,这个过程会产生大量的网络I/O和磁盘I/O开销。
      • 故障恢复复杂:如果某个子RDD分区丢失,由于其依赖多个父RDD分区,需要重新计算所有相关的父RDD分区,计算成本相对较高。
    • 图例
      ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/94ac2059b5fd403eaf5b6ccfdd18d679.png
  4. 对Spark执行效率和容错性的影响

    • 执行效率
      • Spark在调度任务时,会尽量将窄依赖的操作组成流水线(pipeline)一起执行,以减少数据传输和磁盘I/O开销。而对于宽依赖,由于涉及数据混洗,会导致更多的网络和磁盘资源消耗,所以Spark会在宽依赖处划分阶段(Stage)。一个阶段内的操作主要是窄依赖操作,这样可以有效地利用集群资源,提高执行效率。
    • 容错性
      • 窄依赖的容错性恢复机制相对简单,只需要重新计算丢失分区对应的父RDD分区。而宽依赖的容错恢复成本较高,因为需要重新计算多个父RDD分区。不过,Spark利用RDD的血缘关系(Lineage)来记录RDD之间的依赖关系,无论是窄依赖还是宽依赖,都可以通过血缘关系来恢复丢失的数据。在实际应用中,合理设计RDD的转换操作,尽量减少宽依赖的产生,可以提高整个应用程序的容错性和性能。

5.为什么要标记宽窄关系?

  • 1)提高数据容错的性能,避免分区数据丢失时,需要重新构建整个RDD
    • 场景:如果子RDD的某个分区的数据丢失
      不标记:不清楚父RDD与子RDD数据之间的关系,必须重新构建整个父RDD所有数据
      标记了:父RDD一个分区只对应子RDD的一个分区,按照对应关系恢复父RDD的对应分区即可。
  • 提高数据转换的性能,将连续窄依赖操作使用同一个Task都放在内存中直接转换
    • 场景:如果RDD需要多个map、flatMap、filter、 reduceByKey、sortByKey等算子的转换操作
      不标记:每个转换不知道会不会经过Shuffle,都使用不同的 Task来完成,每个Task的结果要保存到磁盘
      标记了:多个连续窄依赖算子放在一个Stage中,共用一套 Task在内存中完成所有转换,性能更快。

http://www.ppmy.cn/news/1551545.html

相关文章

信息网络安全考试gjdw

序号 一级纲要 二级纲要 题目分类 题型 题干 选项 答案 题目依据 试题分数 试题编码 备注 说明 1 信息安规 \ 专业题库 单选题 根据信息安规规定,试验和推广信息新技术,应制定相应的( ),经本单位…

yolov5 解决:Traceback (most recent call last)

运行train.py程序后训练之后,到最后验证的那一步报一个线程异常的错误 原因:pillow版本太高了,把pillow降级就行了 pillow官网上的python对应版本 在conda中,您可以安装pillow的任何可用版本。要查看可用的pillow版本,…

在并发情况下,Elasticsearch如果保证读写一致?

大家好,我是锋哥。今天分享关于【在并发情况下,Elasticsearch如果保证读写一致?】面试题。希望对大家有帮助; 在并发情况下,Elasticsearch如果保证读写一致? 1000道 互联网大厂Java工程师 精选面试题-Java…

Vue.js 中的事件监听与事件修饰符

在 Vue.js 中,事件监听是一种常见的交互方式,它允许我们在用户与界面交互时执行特定的代码。Vue.js 提供了一种简洁的语法来绑定事件监听器,并且支持事件修饰符来控制事件的行为。在本篇博客中,我们将详细介绍 Vue.js 中的事件监听…

自然语言处理期末试题汇总

建议自己做,写完再来对答案。答案可能存在极小部分错误,不保证一定正确。 一、选择题 1-10、C A D B D B C D A A 11-20、A A A C A B D B B A 21-30、B C C D D A C A C B 31-40、B B B C D A B B A A 41-50、B D B C A B B B B C 51-60、A D D …

css瀑布流

要实现CSS瀑布流布局&#xff0c;可以使用CSS Grid或CSS Columns。以下是两种方法的简要说明&#xff1a; <div class"list"><div class"list_item"><div>1</div><div>2</div><div>3</div></div>&…

Android实现桌面小部件:今天吃什么

今天吃什么桌面小部件是专为解决日常选择困难症而设计的安卓小部件&#xff0c;它通过轻松愉快的滚动机制&#xff0c;帮助玩家在诸如“今天吃什么”这样的日常琐事中迅速做出决定。 不知道吃什么&#xff1f;别担心&#xff0c;点我帮你选择&#xff01; 创建各个UI背景 app_…

BC-Linux8.6上面手动安装Postgresql17(Docker版)

目标 在BC-Linux的Docker上面手动运行postgresql17容器。 步骤 pg离线镜像文件 # 拉取得pg17 x86_64离线镜像 docker pull --platform linux/amd64 postgres:17-alpine3.20 # 保存pg17离线镜像文件 docker save -o postgres17.tar postgrespg自定义配置文件 # 获取默认配置…