-
宽依赖和窄依赖
2019-03-19 15:43:49宽依赖与窄依赖 窄依赖是指父RDD的每个分区只被子RDD的一个分区所使用,子RDD分区通常对应常数个...宽依赖和窄依赖如下图所示: 相比于宽依赖,窄依赖对优化很有利 ,主要基于以下两点: 宽依赖往往对应着shu...宽依赖与窄依赖
- 窄依赖是指父RDD的每个分区只被子RDD的一个分区所使用,子RDD分区通常对应常数个父RDD分区(O(1),与数据规模无关)
- 相应的,宽依赖是指父RDD的每个分区都可能被多个子RDD分区所使用,子RDD分区通常对应所有的父RDD分区(O(n),与数据规模有关)
宽依赖和窄依赖如下图所示:
相比于宽依赖,窄依赖对优化很有利 ,主要基于以下两点:
-
宽依赖往往对应着shuffle操作,需要在运行过程中将同一个父RDD的分区传入到不同的子RDD分区中,中间可能涉及多个节点之间的数据传输;而窄依赖的每个父RDD的分区只会传入到一个子RDD分区中,通常可以在一个节点内完成转换。
-
当RDD分区丢失时(某个节点故障),spark会对数据进行重算。
- 对于窄依赖,由于父RDD的一个分区只对应一个子RDD分区,这样只需要重算和子RDD分区对应的父RDD分区即可,所以这个重算对数据的利用率是100%的;
- 对于宽依赖,重算的父RDD分区对应多个子RDD分区,这样实际上父RDD 中只有一部分的数据是被用于恢复这个丢失的子RDD分区的,另一部分对应子RDD的其它未丢失分区,这就造成了多余的计算;更一般的,宽依赖中子RDD分区通常来自多个父RDD分区,极端情况下,所有的父RDD分区都要进行重新计算。
-
如下图所示,b1分区丢失,则需要重新计算a1,a2和a3,这就产生了冗余计算(a1,a2,a3中对应b2的数据)。
以下是文章 RDD:基于内存的集群计算容错抽象 中对宽依赖和窄依赖的对比。
区分这两种依赖很有用。首先,窄依赖允许在一个集群节点上以流水线的方式(pipeline)计算所有父分区。例如,逐个元素地执行map、然后filter操作;而宽依赖则需要首先计算好所有父分区数据,然后在节点之间进行Shuffle,这与MapReduce类似。第二,窄依赖能够更有效地进行失效节点的恢复,即只需重新计算丢失RDD分区的父分区,而且不同节点之间可以并行计算;而对于一个宽依赖关系的Lineage图,单个节点失效可能导致这个RDD的所有祖先丢失部分分区,因而需要整体重新计算。
【误解】之前一直理解错了,以为窄依赖中每个子RDD可能对应多个父RDD,当子RDD丢失时会导致多个父RDD进行重新计算,所以窄依赖不如宽依赖有优势。而实际上应该深入到分区级别去看待这个问题,而且重算的效用也不在于算的多少,而在于有多少是冗余的计算。窄依赖中需要重算的都是必须的,所以重算不冗余。
窄依赖的函数有:map, filter, union, join(父RDD是hash-partitioned ), mapPartitions, mapValues
宽依赖的函数有:groupByKey, join(父RDD不是hash-partitioned ), partitionBy -
宽依赖和窄依赖_Spark宽依赖和窄依赖深度剖析
2020-12-31 12:59:01宽依赖和窄依赖深度剖析.pngRDD依赖关系与stage划分Spark中RDD的高效与DAG图有着莫大的关系,在DAG调度中需要对计算过程划分stage,而划分依据就是RDD之间的依赖关系。1. 窄依赖与宽依赖针对不同的转换函数,RDD之间...宽依赖和窄依赖深度剖析.png
RDD依赖关系与stage划分
Spark中RDD的高效与DAG图有着莫大的关系,在DAG调度中需要对计算过程划分stage,而划分依据就是RDD之间的依赖关系。
1. 窄依赖与宽依赖
针对不同的转换函数,RDD之间的依赖关系分为窄依赖(narrow dependency)和宽依赖(wide dependency,也成shuffle dependency)。
1.1 窄依赖
窄依赖是指1个父RDD分区对应1个子RDD的分区。换句话说,一个父RDD的分区对应于一个子RDD的分区,或者多个父RDD的分区对应于一个子RDD的分区。所以窄依赖又可以分为两种情况:
1个子RDD的分区对应于1个父RDD的分区,比如map,filter,union等算子
1个子RDD的分区对应于N个父RDD的分区,比如co-partioned join
1.2 宽依赖
宽依赖是指1个父RDD分区对应多个子RDD分区。宽依赖有分为两种情况
1个父RDD对应非全部多个子RDD分区,比如groupByKey,reduceByKey,sortByKey
1个父RDD对应所有子RDD分区,比如未经协同划分的join
窄依赖与宽依赖.png
总结:如果父RDD分区对应1个子RDD的分区就是窄依赖,否则就是宽依赖。
2. 为什么Spark将依赖分为窄依赖和宽依赖
2.1 窄依赖(narrow dependency)
可以支持在同一个集群Executor上,以pipeline管道形式顺序执行多条命令,例如在执行了map后,紧接着执行filter。分区内的计算收敛,不需要依赖所有分区的数据,可以并行地在不同节点进行计算。所以它的失败回复也更有效,因为它只需要重新计算丢失的parent partition即可
2.2 宽依赖(shuffle dependency)
则需要所有的父分区都是可用的,必须等RDD的parent partition数据全部ready之后才能开始计算,可能还需要调用类似MapReduce之类的操作进行跨节点传递。从失败恢复的角度看,shuffle dependency牵涉RDD各级的多个parent partition。
3. DAG
RDD之间的依赖关系就形成了DAG(有向无环图)
在Spark作业调度系统中,调度的前提是判断多个作业任务的依赖关系,这些作业任务之间可能存在因果的依赖关系,也就是说有些任务必须先获得执行,然后相关的依赖人物才能执行,但是任务之间显然不应出现任何直接或间接的循环依赖关系,所以本质上这种关系适合用DAG表示
4. stage划分
由于shuffle依赖必须等RDD的父RDD分区数据全部可读之后才能开始计算,因此Spark的设计是让父RDD将结果写在本地,完全写完之后,通知后面的RDD。后面的RDD则首先去读之前RDD的本地数据作为输入,然后进行运算。
由于上述特性,讲shuffle依赖就必须分为两个阶段(stage)去做:
(1)第1个阶段(stage)需要把结果shuffle到本地,例如reduceByKey,首先要聚合某个key的所有记录,才能进行下一步的reduce计算,这个汇聚的过程就是shuffle。
(2) 第二个阶段(stage)则读入数据进行处理。
为什么要写在本地?
后面的RDD多个分区都要去读这个信息,如果放到内存,假如出现数据丢失,后面所有的步骤全部不能进行,违背了之前所说的需要父RDD分区数据全部ready的原则。
同一个stage里面的task是可以并发执行的,下一个stage要等前一个stage ready(和map reduce的reduce需要等map过程ready一脉相承)。
Spark 将任务以 shuffle 依赖(宽依赖)为边界打散,划分多个 Stage. 最后的结果阶段叫做 ResultStage, 其它阶段叫 ShuffleMapStage, 从后往前推导,依将计算。
RDD的划分.png
1.从后往前推理,遇到宽依赖就断开,遇到窄依赖就把当前RDD加入到该Stage
2.每个Stage里面Task的数量是由该Stage中最后一个RDD的Partition的数量所决定的。
3.最后一个Stage里面的任务类型是ResultTask,前面其他所有的Stage的任务类型是ShuffleMapTask。
4.代表当前Stage的算子一定是该Stage的最后一个计算步骤
表面上看是数据在流动,实质上是算子在流动。
(1)数据不动代码动
(2)在一个Stage内部算子为何会流动(Pipeline)?首先是算子合并,也就是所谓的函数式编程的执行的时候最终进行函数的展开从而把一个Stage内部的多个算子合并成为一个大算子(其内部包含了当前Stage中所有算子对数据的计算逻辑);其次,是由于Transformation操作的Lazy特性!在具体算子交给集群的Executor计算之前首先会通过Spark Framework(DAGScheduler)进行算子的优化(基于数据本地性的Pipeline)。
5. Spark计算引擎原理
通过RDD,创建DAG(逻辑计划)
为DAG生成物理查询计划
调度并执行Task
分布式执行Task
计算引擎.png
-
宽依赖和窄依赖_Spark RDD的宽依赖和窄依赖
2020-12-23 07:47:451、宽依赖和窄依赖说明由于RDD是粗粒度的操作数据集,每个Transformation操作都会生成一个新的RDD,所以RDD之间就会形成类似流水线的前后依赖关系;RDD和它依赖的父RDD(s)的关系有两种不同的类型,即窄依赖(narrow ...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宽依赖和窄依赖
2020-03-26 16:48:45 -
宽依赖和窄依赖_每次进步一点点——Spark 中的宽依赖和窄依赖
2021-02-12 01:02:59针对不同的转换函数,RDD之间的依赖关系分类窄依赖(narrow dependency)和宽依赖(wide dependency, 也称 shuffle dependency).宽依赖与窄依赖窄依赖是指父RDD的每个分区只被子RDD的一个分区所使用,子RDD分区通常对应... -
Spark宽依赖和窄依赖深度剖析
2021-03-12 15:02:30参考文章:Spark宽依赖和窄依赖深度剖析 宽依赖和窄依赖深度剖析.png RDD依赖关系与stage划分 Spark中RDD的高效与DAG图有着莫大的关系,在DAG调度中需要对计算过程划分stage,而划分依据就是RDD之间的依赖关系... -
Spark RDD宽依赖和窄依赖
2020-03-14 15:11:35Spark中RDD是相互依赖的,依赖关系分宽依赖和窄依赖 -
Spark的宽依赖和窄依赖
2020-12-18 16:39:20RDD算子操作会使得RDD分区之间产生不同依赖,主要有两种依赖:宽依赖和窄依赖。 宽依赖:是指一个父RDD的各个分区被一个子RDD的各个分区多次依赖, 窄依赖:是指一个父RDD的各个分区被一个子RDD的各个分区一次依赖,... -
spark的宽依赖和窄依赖
2018-11-05 19:05:00spark的宽依赖和窄依赖 spark 划分stage取决于rdd之间的依赖,rdd之间的依赖分为宽依赖和窄依赖 窄依赖是指 父rdd的一个分区指被子rdd的一个分区使用,参考下图,父rdd只会被一个子rdd使用 宽依赖父rdd的每一个... -
Spark什么是宽依赖和窄依赖
2021-02-10 08:59:40宽依赖和窄依赖 什么是依赖关系 当前的RDD和它的上级的RDD之间的一个描述. 一个应用下面有job,job下面有阶段,阶段怎么划分的,就是通过依赖关系划分的. 窄依赖 窄依赖表示每一个父RDD的Partition最多被子RDD的一个... -
RDD的宽依赖和窄依赖
2019-11-30 15:09:471、RDD的宽依赖和窄依赖的区别 是否有shuffle操作,也叫洗牌操作 窄依赖: 一对一 或者 多对一 宽依赖: 一对多 窄依赖可以进行流水线优化,宽依赖不可以 优化:fork/join 机制 一个作业可以划分成多个阶段 ... -
宽依赖和窄依赖的区别
2020-01-13 21:49:00宽依赖和窄依赖的区别 参考: https://blog.csdn.net/u013384984/article/details/80963455 总结一下: 窄依赖:父RDD中,每个分区内的数据,都只会被子RDD中特定的分区所消费,为窄依赖: **宽依赖:**父RDD中,... -
spark学习笔记之二:宽依赖和窄依赖
2017-07-27 17:17:42宽依赖和窄依赖 -
宽依赖和窄依赖深度剖析
2018-04-25 09:39:32宽依赖和窄依赖深度剖析宽依赖和窄依赖的概念: 窄依赖:一个RDD,对其父RDD只有简单的一对一的依赖关系。即父RDD和子RDD的partition的对应关系是一对一的 宽依赖:英文名称shuffle dependency本质就是shuffle。也... -
Spark:宽依赖和窄依赖
2018-08-28 11:50:00宽依赖和窄依赖: 宽依赖:父RDD的分区被子RDD的多个分区使用 例如 groupByKey、reduceByKey、sortByKey等操作会产生宽依赖,会产生shuffle 窄依赖:父RDD的每个分区都只被子RDD的一个分区使用 例如map、... -
宽依赖和窄依赖_spark的宽依赖窄依赖
2020-12-23 07:47:441RDD的依赖关系及容错1.1RDD的依赖关系RDD的依赖关系分为两种:窄依赖(Narrow Dependencies)与宽依赖(Wide Dependencies,源码中称为ShuffleDependencies)依赖有2个作用,其一用来解决数据容错的高效性;其二用来... -
宽依赖和窄依赖_【Spark】SparkCore解析(一):宽依赖和窄依赖
2020-12-23 07:48:45RDD和它依赖的父RDD(s)的关系有两种不同的类型,即窄依赖(narrow dependency)和宽依赖(wide dependency)。如图所示显示了RDD之间的依赖关系???? 窄依赖:是指每个父RDD的每个Partition都只被子RDD的一个... -
宽依赖和窄依赖_Spark RDD中的依赖关系:宽依赖和窄依赖narrow/widedependency
2021-02-12 01:02:57前言:前面我们讲过,RDD的转化Transformation...先不说概念,看个例子:请问图(1)和图(2)在对RDD的依赖上有什么区别呢?(1)filter并不依赖map()生成的RDD的所有分区,也就是说即使map没有全部完成我也可以开始filte... -
Spark中的宽依赖和窄依赖的区别
2020-03-13 10:34:06开门见山,本文就针对一个点,谈谈Spark中的宽依赖和窄依赖,这是Spark计算引擎划分Stage的根源所在,遇到宽依赖,则划分为多个stage,针对每个Stage,提交一个TaskSet: 上图:一张网上的图: 基于此图,分析下... -
Spark中的宽依赖和窄依赖
2017-11-23 22:54:191.宽依赖和窄依赖的原理 http://shiyanjun.cn/archives/744.html 窄依赖的原理:是指父RDD的分区只被子RDD的一个分区使用。 特点: (1)窄依赖允许在一个集群节点上以流水线的方式(pipeline)计算所有父分区... -
聊聊Spark中的宽依赖和窄依赖
2018-07-08 22:35:46开门见山,本文就针对一个点,谈谈Spark中的宽依赖和窄依赖,这是Spark计算引擎划分Stage的根源所在,遇到宽依赖,则划分为多个stage,针对每个Stage,提交一个TaskSet:上图:一张网上的图:基于此图,分析下这里为... -
spark 中 宽依赖 和 窄依赖的 区别及优缺点
2020-04-26 01:10:36spark 中 宽依赖 和 窄依赖的 区别及优缺点 原创it_liangsir 最后发布于2018-06-29 17:58:02 阅读数 3315 收藏 展开 窄依赖与宽依赖的概述: rdd 中的–宽依赖—父RDD每个分区的数据可能被多个子RDD分区使用 ,子RDD... -
SparkCore(14):RDD宽依赖和窄依赖
2018-10-25 22:02:121.宽依赖和窄依赖操作算子的区别 2.宽依赖和窄依赖类型区别 二、概念 1.窄依赖 (1)概念 子RDD的每个分区的数据来自常数个父RDD分区;父RDD的每个分区的数据到子RDD的时候在一个分区中进行处理。即,父... -
Spark --【宽依赖和窄依赖】
2017-12-07 09:41:25Spark --【宽依赖和窄依赖】 前言 Spark中RDD的高效与DAG图有着莫大的关系,在DAG调度中需要对计算过程划分stage,暴力的理解就是stage的划分是按照有没有涉及到shuffle来划分的,没涉及的shuffle的都划分在一... -
Spark(四)Spark血统概念——宽依赖和窄依赖
2019-09-29 10:00:012.宽依赖和窄依赖 3.宽依赖与窄依赖之间的对比 1.血统概念 利用内存加快数据加载,在众多的其它的In-Memory类数据库或Cache类系统中也有实现,Spark的主要区别在于它处理分布式运算环境下的数据容错性(节点实效/...