文章目录

  • 零、本讲学习目标
  • 一、RDD的依赖
    • (一)窄依赖
      • 1、map()与filter()算子
      • 2、union()算子
      • 3、join()算子
    • (二)宽依赖
      • 1、groupBy()算子
      • 2、join()算子
      • 3、reduceByKey()算子
    • (三)两种依赖的比较
  • 二、Stage划分
    • (一)有向无环图
    • (二)Stage划分依据
      • 1、两阶段案例
      • 3、三阶段案例

零、本讲学习目标

  1. 理解RDD的宽依赖与窄依赖
  2. 理解Spark根据DAG将计算划分多个阶段

一、RDD的依赖

  • 在Spark中,对RDD的每一次转化操作都会生成一个新的RDD,由于RDD的懒加载特性,新的RDD会依赖原有RDD,因此RDD之间存在类似流水线的前后依赖关系。这种依赖关系分为两种:窄依赖和宽依赖。

(一)窄依赖

  • 窄依赖是指父RDD的一个分区最多被子RDD的一个分区所用。也就是说,父RDD的分区与子RDD的分区的对应关系为一对一或多对一。例如,map()、filter()、union()、join()等操作都会产生窄依赖。

1、map()与filter()算子

  • 一对一的依赖

2、union()算子

  • 多对一的依赖

3、join()算子

  • 多对一的依赖
  • 对于窄依赖的RDD,根据父RDD的分区进行流水线操作,即可计算出子RDD的分区数据,整个操作可以在集群的一个节点上执行。

(二)宽依赖

  • 宽依赖是指父RDD的一个分区被子RDD的多个分区所用。也就是说,父RDD的分区与子RDD的分区的对应关系为多对多。例如,groupByKey()、reduceByKey()、sortByKey()等操作都会产生宽依赖。

1、groupBy()算子

2、join()算子

  • join()操作的依赖关系分两种情况:RDD的一个分区仅和另一个RDD中已知个数的分区进行组合,这种类型的join()操作是窄依赖,其他情况则是宽依赖。
  • 在宽依赖关系中,RDD会根据每条记录的key进行不同分区的数据聚集,数据聚集的过程称作Shuffle,类似MapReduce中的Shuffle过程。举个生活中的例子,4个人一起打牌,打完牌后需要进行洗牌,这4个人相当于4个分区,每个人手里的牌则相当于分区里的数据,洗牌的过程可以理解为Shuffle。因此,Shuffle其实就是不同分区之间的数据聚集或者说数据混洗。Shuffle是一项耗费资源的操作,因为它涉及磁盘I/O、数据序列化和网络I/O。

3、reduceByKey()算子

  • 对一个RDD进行reduceByKey()操作,RDD中相同key的所有记录将进行聚合,而key相同的所有记录可能不在同一个分区中,甚至不在同一个节点上,但是该操作必须将这些记录聚集到一起进行计算才能保证结果准确,因此reduceByKey()操作会产生Shuffle,也会产生宽依赖。

(三)两种依赖的比较

  • 在数据容错方面,窄依赖要优于宽依赖。当子RDD的某一个分区的数据丢失时,若是窄依赖,则只需重算和该分区对应的父RDD分区即可,而宽依赖需要重算父RDD的所有分区。在groupByKey()操作中,若RDD2的分区1丢失,则需要重新计算RDD1的所有分区(分区1、分区2、分区3)才能对其进行恢复。此外,宽依赖在进行Shuffle之前,需要计算好所有父分区的数据,若某个父分区的数据未计算完毕,则需要等待。

二、Stage划分

(一)有向无环图

  • 在Spark中,对每一个RDD的操作都会生成一个新的RDD,将这些RDD用带方向的直线连接起来(从父RDD连接到子RDD)会形成一个关于计算路径的有向无环图,称为DAG(Directed Acyclic Graph)。

(二)Stage划分依据

  • Spark会根据DAG将整个计算划分为多个阶段,每个阶段称为一个Stage。每个Stage由多个Task任务并行进行计算,每个Task任务作用在一个分区上,一个Stage的总Task任务数量是由Stage中最后一个RDD的分区个数决定的
  • Stage的划分依据为是否有宽依赖,即是否有Shuffle。Spark调度器会从DAG图的末端向前进行递归划分,遇到Shuffle则进行划分,Shuffle之前的所有RDD组成一个Stage,整个DAG图为一个Stage。

1、两阶段案例

  • 经典的单词计数执行流程的Stage划分如下图所示。
  • 上图中的依赖关系一共可以划分为两个Stage:从后向前进行递归划分,RDD3到RDD4的转换是Shuffle操作,因此在RDD3与RDD4之间划开,继续向前查找,RDD1、RDD2、RDD3之间的关系为窄依赖,因此为一个Stage;整个转换过程为一个Stage。

3、三阶段案例

  • 下图中的依赖关系一共可以划分为3个Stage:从后向前进行递归划分,由于RDD6到RDD7的转换是Shuffle操作,因此在RDD6与RDD7之间划开,然后继续向前查找,RDD3、RDD4、RDD5、RDD6为一个Stage;由于RDD1到RDD2的转换是Shuffle操作,因此在RDD1与RDD2之间划开,然后继续向前查找,RDD1为一个Stage;整个转换过程为一个Stage。

Spark基础学习笔记19:RDD的依赖与Stage划分相关推荐

  1. 2022年Spark基础学习笔记目录

    一.Spark学习笔记 在私有云上创建与配置虚拟机 Spark基础学习笔记01:初步了解Spark Spark基础学习笔记02:Spark运行时架构 Spark基础学习笔记03:搭建Spark单机版环 ...

  2. Spark基础学习笔记16:创建RDD

    文章目录 零.本讲学习目标 一.RDD为何物 (一)RDD概念 (二)RDD示例 (三)RDD主要特征 二.做好准备工作 (一)准备文件 1.准备本地系统文件 2.准备HDFS系统文件 (二)启动Sp ...

  3. Spark基础学习笔记10:Scala集成开发环境

    文章目录 零.本讲学习目标 一.搭建Scala的Eclipse开发环境 (一)安装Scala插件 (二)创建Scala项目 二.搭建Scala的IntelliJ IDEA开发环境 (一)启动IDEA ...

  4. 2022年Spark基础学习笔记

    一.Spark学习笔记 在OpenStack私有云上创建与配置虚拟机 Spark基础学习笔记01:初步了解Spark Spark基础学习笔记02:Spark运行时架构 Spark基础学习笔记03:搭建 ...

  5. Spark基础学习笔记20:RDD持久化、存储级别与缓存

    文章目录 零.本讲学习目标 一.RDD持久化 (一)引入持久化的必要性 (二)案例演示持久化操作 1.RDD的依赖关系图 2.不采用持久化操作 3.采用持久化操作 二.存储级别 (一)持久化方法的参数 ...

  6. Spark基础学习笔记04:搭建Spark伪分布式环境

    文章目录 零.本讲学习目标 一.搭建伪分布式Hadoop (一)登录ied虚拟机 (二)配置免密登录 1.生成密钥对 2.将生成的公钥发送到本机(虚拟机ied) 3.验证虚拟机是否能免密登录本机 (三 ...

  7. Spark基础学习笔记22:Spark RDD案例分析

    文章目录 零.本讲学习目标 一.案例分析:Spark RDD实现单词计数 (一)案例概述 (二)实现步骤 1.新建Maven管理的Spark项目 2.添加Scala和Spark依赖 3.创建WordC ...

  8. Spark基础学习笔记17:掌握RDD算子

    文章目录 零.本讲学习目标 一.RDD算子 二.准备工作 (一)准备文件 1.准备本地系统文件 2.准备HDFS系统文件 (二)启动Spark Shell 1.启动HDFS服务 2.启动Spark服务 ...

  9. Spark基础学习笔记01:初步了解Spark

    文章目录 零.本讲学习目标 一.大数据开发总体架构 二.Spark简介 三.Spark发展史 四.Spark特点 (一)快速 (二)易用 (三)通用 (四)随处运行 (五)代码简洁 1.采用MR实现词 ...

最新文章

  1. Algs4-1.1.21打印表格
  2. 图像阈值处理cv2.threshold()函数(python)
  3. Codeforces Round #490 (Div. 3)【完结】
  4. 关于“指针的指针”的认识(值传递、指针传递区分)
  5. 四因素三水平正交试验表_软件测试|正交试验测试用例设计方法
  6. 收集bug开源框架_划重点 | 小程序框架全面测评
  7. mysql 格林时间转换_格林时间转换成正常时间
  8. 计算机网络课程思政教学设计,信息与网络工程学院成功举办第一届课程思政教学设计大赛...
  9. 编写高质量可维护的代码:优雅命名
  10. jp在java中无法编译_为什么我的JAVA程序无法编译呢?
  11. 关于cell中添加子视图 复用重叠问题的解决方法
  12. SQL Server 2014各个版本区别
  13. 【ZOJ 4070】Function and Function
  14. LitePal简单用法
  15. 这几个截图文字识别软件可以自动识别文字
  16. 向量场的散度和旋度_矢量场散度和旋度的物理意义
  17. 洛谷P4556 [Vani有约会]雨天的尾巴
  18. python循环读取excel存入列表_python3 循环读取excel文件并写入json操作
  19. java实现关键字查询_SpringData关键字查询实现方法详解
  20. 雷神ZERO游戏本和ROG冰刃5Plus的 区别 选哪个

热门文章

  1. 【华为云技术分享】弹性负载均衡服务助力企业应对高并发流量冲击
  2. leetcode306 2022.1.10
  3. Head First设计模式读书笔记八 第九章上 迭代器模式
  4. IPython高级用法(一)定制命令别名及存储别名
  5. 【电脑问题】win10更新后,java环境有问题:Error:missing `server` JVM at `*:\java\jre8\bin\server\jvm.dll`
  6. [Spark] - HashPartitioner RangePartitioner 区别
  7. Vue2.0 探索之路——生命周期和钩子函数
  8. 计算机技术知识字,计算机基础知识
  9. php要懂函数吗,九个你需要知道的PHP函数和功能
  10. c语言添加收支情况,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...