每次进步一点点——Spark 中的宽依赖和窄依赖
来源:互联网 发布:远程监控软件 编辑:程序博客网 时间:2024/05/20 23:02
Spark中RDD的高效与DAG图有着莫大的关系,在DAG调度中需要对计算过程划分stage,而划分依据就是RDD之间的依赖关系。针对不同的转换函数,RDD之间的依赖关系分类窄依赖(narrow dependency)和宽依赖(wide dependency, 也称 shuffle dependency).
宽依赖与窄依赖
- 窄依赖是指父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
参考:
RDD:基于内存的集群计算容错抽象
Spark技术内幕:Stage划分及提交源码分析
Spark分布式计算和RDD模型研究
SPARK 阔依赖 和窄依赖 transfer action lazy策略之间的关系
- 每次进步一点点——Spark 中的宽依赖和窄依赖
- Spark 中的宽依赖和窄依赖
- Spark 中的宽依赖和窄依赖
- Spark 中的宽依赖和窄依赖
- Spark 中的宽依赖和窄依赖
- Spark中的宽依赖和窄依赖
- 每次进步一点点——spark中cache和persist的区别
- 聊聊spark中的宽依赖和窄依赖
- Spark中窄依赖和宽依赖
- spark的宽依赖和窄依赖
- Spark中宽依赖和窄依赖
- Spark --【宽依赖和窄依赖】
- 【Spark】窄依赖和宽依赖区别
- 每次进步一点点——linux expect 使用
- spark学习笔记之二:宽依赖和窄依赖
- Spark中宽依赖和窄依赖的区别
- Spark内核深度剖析之宽依赖和窄依赖
- spark-宽依赖与窄依赖
- 占位
- HDU 2845 Beans(dp)
- c++使用thread类时编译出错,对‘pthread_create’未定义的引用
- 占位
- linux设备驱动程序之时钟管理
- 每次进步一点点——Spark 中的宽依赖和窄依赖
- 占位
- 占位
- 占位
- 占位
- 动态规划之背包问题(一)
- android 开发中什么是内存泄露什么又是内存溢出?两者的区别是什么?
- 安装.NET Framework 4,一直停留在正在安装 .NET Framework 4 Client Profile
- 映射一对一关联关系