1、宽依赖和窄依赖说明

由于RDD是粗粒度的操作数据集,每个Transformation操作都会生成一个新的RDD,所以RDD之间就会形成类似流水线的前后依赖关系;RDD和它依赖的父RDD(s)的关系有两种不同的类型,即窄依赖(narrow dependency)和宽依赖(wide dependency)。如图所示显示了RDD之间的依赖关系。

从图中可知:

窄依赖:是指每个父RDD的一个Partition最多被子RDD的一个Partition所使用,例如map、filter、union等操作都会产生窄依赖;(独生子女)

宽依赖:是指一个父RDD的Partition会被多个子RDD的Partition所使用,例如groupByKey、reduceByKey、sortByKey等操作都会产生宽依赖;(超生)

需要特别说明的是对join操作有两种情况:

(1)图中左半部分join:如果两个RDD在进行join操作时,一个RDD的partition仅仅和另一个RDD中已知个数的Partition进行join,那么这种类型的join操作就是窄依赖,例如图1中左半部分的join操作(join with inputs co-partitioned);

(2)图中右半部分join:其它情况的join操作就是宽依赖,例如图1中右半部分的join操作(join with inputs not co-partitioned),由于是需要父RDD的所有partition进行join的转换,这就涉及到了shuffle,因此这种类型的join操作也是宽依赖。

2、 依赖关系下的数据流视图

在spark中,会根据RDD之间的依赖关系将DAG图(有向无环图)划分为不同的阶段,对于窄依赖,由于partition依赖关系的确定性,partition的转换处理就可以在同一个线程里完成,窄依赖就被spark划分到同一个stage中,而对于宽依赖,只能等父RDD shuffle处理完成后,下一个stage才能开始接下来的计算。

因此spark划分stage的整体思路是:从后往前推,遇到宽依赖就断开,划分为一个stage;遇到窄依赖就将这个RDD加入该stage中。因此在图2中RDD C,RDD D,RDD E,RDDF被构建在一个stage中,RDD A被构建在一个单独的Stage中,而RDD B和RDD G又被构建在同一个stage中。

在spark中,Task的类型分为2种:ShuffleMapTask和ResultTask;

简单来说,DAG的最后一个阶段会为每个结果的partition生成一个ResultTask,即每个Stage里面的Task的数量是由该Stage中最后一个RDD的Partition的数量所决定的!而其余所有阶段都会生成ShuffleMapTask;之所以称之为ShuffleMapTask是因为它需要将自己的计算结果通过shuffle到下一个stage中;也就是说上图中的stage1和stage2相当于mapreduce中的Mapper,而ResultTask所代表的stage3就相当于mapreduce中的reducer。

在之前动手操作了一个wordcount程序,因此可知,Hadoop中MapReduce操作中的Mapper和Reducer在spark中的基本等量算子是map和reduceByKey;不过区别在于:Hadoop中的MapReduce天生就是排序的;而reduceByKey只是根据Key进行reduce,但spark除了这两个算子还有其他的算子;因此从这个意义上来说,Spark比Hadoop的计算算子更为丰富。

codeobj , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权

转载请注明原文链接:Spark RDD的宽依赖和窄依赖

宽依赖和窄依赖_Spark RDD的宽依赖和窄依赖相关推荐

  1. 宽依赖和窄依赖_Spark RDD中的依赖关系:宽依赖和窄依赖narrow/widedependency

    前言:前面我们讲过,RDD的转化Transformation操作是一个RDD生成另一个新的RDD的过程,那么新的RDD必然依赖原来的RDD.那么RDD的依赖分为几种,分别是什么含义呢?为什么要分类呢? ...

  2. Spark RDD的宽依赖和窄依赖

    系列文章目录 Spark RDD 的宽窄依赖关系 一.RDD的依赖关系? 在 Spark 中,RDD 分区的数据不支持修改,是只读的.如果想更新 RDD 分区中的数据,那么只 能对原有 RDD 进行转 ...

  3. db2有主键时默认hash分区_Spark RDD依赖关系以及分区属性

    RDD的依赖关系 Spark中使用DAG(有向无环图)来描述RDD之间的依赖关系,根据依赖关系的不同,划分为宽依赖和窄依赖 通过上图,可以很容易得出所谓宽依赖:多个子RDD的partition会依赖同 ...

  4. gradle 查看依赖类库版本_如何查找第三方库(Gradle引用)的依赖?

    原标题:如何查找第三方库(Gradle引用)的依赖? 如何查找第三方库(Gradle引用)的依赖? 每日一问-Tools-20181105 答: 三方法可查找. 1. 执行 Gradle Task : ...

  5. 依赖注入的三种方式_Spring IoC是如何进行依赖注入的

    依赖注入(DI) DI(Dependency Injection),Spring IoC 不是一种技术,而是一种思想,通过这种思想,能够指导我们设计出松耦合的程序代码.而Spring IoC这个思想的 ...

  6. maven pom.xml解析、命令说明、依赖传递、继承、聚合、properties、build、依赖范围、版本仲裁、profile

    maven是当前Java项目中用到最多的依赖管理工具.最开始的项目比较小引入的依赖包也少所以可以通过手动加载jar包的方式来管理依赖包:但随着项目越来越复杂各种大小框架层出不穷,一个项目的开发往往依赖 ...

  7. 位宽512bit显卡_显卡位宽是什么?详解显卡位宽基础知识科普!

    由于买电脑的时候大家对显卡的显存大小过于重视,很多人忽视了显存位宽的重要性,甚至出现2GB独立显卡但是位宽只有64bit这样坑人的显卡.也许有人说,显卡位宽做大点不就好了么.这是不对的,显卡位宽的扩大 ...

  8. 【数仓建模】传统建模与宽表建模有何差异?基于宽表建模实践

    [数仓建模]传统建模与宽表建模有何差异?基于宽表建模实践 一.业务背景 1.1 数据建模现状: 1.2 当前业务特性与趋势 二.面临的问题 2.1 在数据驱动业务越来越重要的大趋势下,面临的问题 2. ...

  9. EasyExcel 的行高列宽的单位,直接设置行高列宽的大小

    前言 有没有小伙伴用EasyExcel设置表的行高列宽时,会有点疑惑,这个 Integer 或者 Short 对应的是什么单位,我们应该设置多大的值,才能满足表的样式需要? 我刚开始使用EasyExc ...

最新文章

  1. CUBRID学习笔记 42 Hierarchical QuerySQL层级查询
  2. java singleton 数据清楚_成都汇智动力-java singleton
  3. CCF关于暂停NOIP竞赛的公告
  4. ELK Stack 与 Elastic Stack 的异同点
  5. 如何安装tensorflowGPU环境搭建(不报AVX2的警告)
  6. 后续的C++测试并不一定会成功
  7. 深入理解HTTP协议、HTTP协议原理分析【转】
  8. mysql 触发器 new.id,mysql触发器的使用方法
  9. 程序转制作人——游戏设计课程导论
  10. 微信小程序 video 视频 组件
  11. Mac动态桌面壁纸Dynamic Wallpaper惊艳你的桌面
  12. ASP.NET Core3.1 入门介绍
  13. 多个blockquote_换句话说:使用blockquote,cite和q元素
  14. 文献速递 | 宿主细胞中SARS-CoV-2(新冠病毒)的m⁶A甲基化研究
  15. 项目总结报告(小米商城)
  16. 【产业互联网周报】网信办:不得利用算法影响网络舆论;华为任命丁耘为企业BG总裁;上海市布局数字经济、元宇宙等新赛道...
  17. C语言实现通讯录1.0
  18. MessageBox弹出的对话框放置在最前面
  19. 图文详解 HBase 的读写流程
  20. Python办公自动化学习笔记--Word操作

热门文章

  1. 苹果icloud登录_怎么取消iCloud云上贵州运营的扣费
  2. 红队攻击演练过程中必须具备哪些能力
  3. Bootstrap项目之微金所
  4. veket linux安装到硬盘,安装veket到移动硬盘NTFS分区
  5. C++求1000以内水仙花数
  6. c语言规定整型变量长度,搞透C语言整型数据范围表示
  7. Nat. Aging︱老药新用发现——西地那非有助于预防或治疗老年痴呆
  8. 尚硅谷大数据开发Day04
  9. Leetcode1407. 排名靠前的旅行者
  10. 模电学习2. NPN型三极管电流电压计算实战