Spark---RDD依赖关系

这篇具有很好参考价值的文章主要介绍了Spark---RDD依赖关系。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.1 RDD依赖关系

Spark---RDD依赖关系,大数据,scala,spark,spark,ajax,javascript
在Spark中,一个RDD的形成依赖于另一个RDD,则称这两个RDD具有依赖关系(一般指相邻的两个RDD之间的关系) ,RDD的依赖关系对于优化Spark应用程序的性能和可靠性非常重要。通过合理地设计RDD的转换和动作操作,可以避免不必要的Shuffle操作,提高计算效率。

    //读取数据
    val lines:RDD[String] = context.textFile("D:\\learnSoftWare\\IdeaProject\\Spark_Demo\\Spark_Core\\src\\main\\com.mao\\datas\\1.txt")
    //执行扁平化操作
    val words : RDD[String] = lines.flatMap((a: String) => a.split(" "))

words的形成依赖于lines,这两个RDD之间就有依赖关系

1.2 血缘关系

依赖关系是对于相邻的两个RDD来说的,如果多个RDD之间存在依赖关系,则称它们之间具有血缘关系。
血缘关系在Spark中起着重要的作用。血缘关系记录了RDD的元数据信息和转换行为,主要用于容错和优化。
由于RDD中是不存储数据的,当计算发生错误的时候,很难重新计算丢失的数据分区。通过记录RDD的血缘关系,Spark可以在数据分区丢失时重新读取数据源并进行计算,从而恢复丢失的数据分区。 这样,即使在处理大规模数据集时,也能保证Spark作业的可靠性和稳定性。
其次,血缘关系还有助于Spark优化查询计划和性能。

    //执行业务操作
    val lines:RDD[String] = context.textFile("D:\\learnSoftWare\\IdeaProject\\Spark_Demo\\Spark_Core\\src\\main\\com.mao\\datas\\1.txt")
    //执行扁平化操作
    //扁平化就是将多个集合打散为一个集合
    val words: RDD[String] = lines.flatMap((a: String) => a.split(" "))

    val wordGroup: RDD[(String, Iterable[String])] = words.groupBy((word: String) => word)
    
    //对分组后的单词进行转换(hello,1)
    val wordToCount: RDD[(String, Int)] = wordGroup.map({
      case (word, list) => {
        (word, list.size)
      }
    })

如上述代码所示,words的形成依赖于lines,wordGroup依赖于words,wordToCount依赖于wordGroup。这些RDD之间就形成了血缘关系。

1.3 依赖关系分类

在Spark中的依赖关系,可以分为窄依赖和宽依赖(也称shuffle依赖)

1.3.1 窄依赖

窄依赖表示每一个父(上游)RDD 的 Partition 最多被子(下游)RDD 的一个 Partition 使用,窄依赖我们形象的比喻为独生子女。

Spark---RDD依赖关系,大数据,scala,spark,spark,ajax,javascript
一个新的分区的数据依赖于一个旧的分区的数据,这样的依赖称之为OneToOne依赖,即窄依赖

1.3.2 宽依赖

宽依赖表示同一个父(上游)RDD 的 Partition 被多个子(下游)RDD 的 Partition 依赖,会引起 Shuffle,总结:宽依赖我们形象的比喻为多生。
Spark---RDD依赖关系,大数据,scala,spark,spark,ajax,javascript
新的分区的数据依赖于多个旧的分区的数据,因为数据会被shuffle,所以宽依赖也被称为shuffle依赖。

1.4 RDD阶段划分和任务划分

1.4.1 RDD阶段划分

RDD(弹性分布式数据集)的阶段划分是在Spark中执行多个RDD时,根据RDD之间的依赖关系进行的。
通过分析各个RDD的依赖关系,可以生成一个依赖图(DAG,有向无环图)。然后,通过分析各个RDD中的分区之间的依赖关系,可以决定如何划分阶段。

Shuffle操作需要在不同的阶段之间进行,因此Spark会根据shuffle依赖关系将数据处理划分为不同的阶段。

DAG(Directed Acyclic Graph)有向无环图是由点和线组成的拓扑图形,该图形具有方向,不会闭环。 例如,DAG 记录了 RDD 的转换过程和任务的阶段。
Spark---RDD依赖关系,大数据,scala,spark,spark,ajax,javascript

具体的划分方法如下:

1.对DAG进行反向解析,遇到宽依赖(ShuffleDependency)就断开,遇到窄依赖就把当前的RDD加入到当前的阶段中。
2.将窄依赖尽量划分在同一个阶段中,这样可以实现流水线计算。
3.一个阶段等于宽依赖(ShuffleDependency)的个数加1。
4.一个阶段中的最后一个RDD的分区个数就是Task的个数。
简而言之,RDD的阶段划分就是在遇到宽依赖时划分出一个新的阶段,每个阶段的任务全部完成,每个分区元素准备就绪后才能进入下一个阶段。

划分出来的阶段的数量=shuffle依赖数量+1

1.4.2 RDD任务划分

RDD 任务切分中间分为:Application、Job、Stage 和 Task
⚫ Application:初始化一个 SparkContext 即生成一个 Application;
⚫ Job:一个 Action 算子就会生成一个 Job;
⚫ Stage:Stage 等于宽依赖(ShuffleDependency)的个数加 1;
⚫ Task:一个 Stage 阶段中,最后一个 RDD 的分区个数就是 Task 的个数。
注意:Application->Job->Stage->Task 每一层都是 1 对 n 的关系。文章来源地址https://www.toymoban.com/news/detail-805020.html

到了这里,关于Spark---RDD依赖关系的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spark-RDD的依赖

    rdd之间是有依赖关系 窄依赖 每个父RDD的一个Partition最多被子RDD的一个Partition所使用 父rdd和子rdd的分区是一对一 map flatMap fliter 宽依赖 父RDD的Partition会被多个子RDD的Partition所使用 父rdd和子rdd的分区是一对多 grouBy() grouByKey() sortBy() sortByKey() reduceBykey() distinct() rdd1 -- rdd2 --rdd3 S

    2024年01月21日
    浏览(28)
  • spark中Rdd依赖和SparkSQL介绍--学习笔记

    1.1概念 rdd的特性之一 相邻rdd之间存在依赖关系(因果关系) 窄依赖 每个父RDD的一个Partition最多被子RDD的一个Partition所使用 父rdd和子rdd的分区是一对一(多对一) 触发窄依赖的算子 map(),flatMap(),filter() 宽依赖 父RDD的一个partition会被子rdd的多个Partition所使用 父rdd和子rdd的

    2024年01月17日
    浏览(34)
  • Spark大数据处理讲课笔记---Spark RDD典型案例

    利用RDD计算总分与平均分 利用RDD统计每日新增用户 利用RDD实现分组排行榜 针对成绩表,计算每个学生总分和平均分   读取成绩文件,生成lines;定义二元组成绩列表;遍历lines,填充二元组成绩列表;基于二元组成绩列表创建RDD;对rdd按键归约得到rdd1,计算总分;将rdd1映射

    2024年02月06日
    浏览(37)
  • Spark【Spark SQL(二)RDD转换DataFrame、Spark SQL读写数据库 】

    Saprk 提供了两种方法来实现从 RDD 转换得到 DataFrame: 利用反射机制推断 RDD 模式 使用编程方式定义 RDD 模式 下面使用到的数据 people.txt :         在利用反射机制推断 RDD 模式的过程时,需要先定义一个 case 类,因为只有 case 类才能被 Spark 隐式地转换为DataFrame对象。 注意

    2024年02月09日
    浏览(38)
  • Spark RDD编程 文件数据读写

    从本地文件系统读取数据,可以采用textFile()方法,可以为textFile()方法提供一个本地文件或目录地址,如果是一个文件地址,它会加载该文件,如果是一个目录地址,它会加载该目录下的所有文件的数据。 示例:读取一个本地文件word.txt val textFile中的textFile是变量名称,sc.t

    2024年02月05日
    浏览(27)
  • 大数据 - Spark系列《六》- RDD详解

    Spark系列文章: 大数据 - Spark系列《一》- 从Hadoop到Spark:大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 大数据 - Spark系列《三》- 加载各种数据源创建RDD-CSDN博客 大数据 - Spark系列《四》- Spark分布式运行原理-CSDN博客 大数据

    2024年02月20日
    浏览(32)
  • Spark大数据分析与实战笔记(第三章 Spark RDD 弹性分布式数据集-02)

    人生很长,不必慌张。你未长大,我要担当。 传统的MapReduce虽然具有自动容错、平衡负载和可拓展性的优点,但是其最大缺点是采用非循环式的数据流模型,使得在迭代计算式要进行大量的磁盘IO操作。Spark中的RDD可以很好的解决这一缺点。 RDD是Spark提供的最重要的抽象概念

    2024年02月22日
    浏览(45)
  • 大数据开发之Spark(RDD弹性分布式数据集)

    rdd(resilient distributed dataset)叫做弹性分布式数据集,是spark中最基本的数据抽象。 代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。 1.1.1 rdd类比工厂生产 1.1.2 wordcount工作流程 1、一组分区(partition),即是数据集的基本组成单位,

    2024年01月24日
    浏览(42)
  • Spark大数据处理讲课笔记--- RDD持久化机制

    理解RDD持久化的必要性 了解RDD的存储级别 学会如何查看RDD缓存 Spark中的RDD是懒加载的,只有当遇到行动算子时才会从头计算所有RDD,而且当同一个RDD被多次使用时,每次都需要重新计算一遍,这样会严重增加消耗。为了避免重复计算同一个RDD,可以将RDD进行持久化。 Spark中

    2024年02月06日
    浏览(33)
  • Spark 大数据实战:基于 RDD 的大数据处理分析

    之前笔者参加了公司内部举办的一个 Big Data Workshop,接触了一些 Spark 的皮毛,后来在工作中陆陆续续又学习了一些 Spark 的实战知识。 本文笔者从小白的视角出发,给大家普及 Spark 的应用知识。 Spark 集群是基于 Apache Spark 的分布式计算环境,用于处理 大规模数据集 的计算任

    2024年01月25日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包