宽依赖和窄依赖

宽依赖和窄依赖声明 本文已对原博客适当添改 亲测有效 便于本人理解 可通过底部链接访问原博客 宽依赖与窄依赖 窄依赖指的是每一个父 RDD 的 Partition 最多被子 RDD 的一个 Partition 使用 宽依赖指的是多个子 RDD 的 Partition 会依赖同一个父 RDD 的 Partition 会引起 shuffle

大家好,我是讯享网,很高兴认识大家。

声明:本文已对原博客适当添改(亲测有效),便于本人理解。可通过底部链接访问原博客。

 

宽依赖与窄依赖

     窄依赖指的是每一个父RDD的Partition最多被子RDD的一个Partition使用。

     宽依赖指的是多个子RDD的Partition会依赖同一个父RDD的Partition,会引起shuffle。


宽依赖和窄依赖如下图所示:

宽依赖和窄依赖示例
讯享网

 

相比于宽依赖,窄依赖对优化很有利 ,主要基于以下两点:

一、宽依赖往往对应着shuffle操作,需要在运行过程中将同一个父RDD的分区传入到不同的子RDD分区中,中间可能涉及多个节点之间的数据传输;而窄依赖的每个父RDD的分区只会传入到一个子RDD分区中,通常可以在一个节点内完成转换。

二、当RDD分区丢失时(某个节点故障),spark会对数据进行重算。

     1)对于窄依赖,由于父RDD的一个分区只对应一个子RDD分区,这样只需要重算和子RDD分区对应的父RDD分区即可,所以这个重算对数据的利用率是100%的。
     2)对于宽依赖,重算的父RDD分区对应多个子RDD分区,这样实际上父RDD 中只有一部分的数据是被用于恢复这个丢失的子RDD分区的,另一部分对应子RDD的其它未丢失分区,这就造成了多余的计算;更一般的,宽依赖中子RDD分区通常来自多个父RDD分区,极端情况下,所有的父RDD分区都要进行重新计算。
     3)如下图所示,b1分区丢失,则需要重新计算a1,a2和a3,这就产生了冗余计算(a1,a2,a3中对应b2的数据)。

宽依赖

以下是文章 RDD:基于内存的集群计算容错抽象 中对宽依赖和窄依赖的对比。

     区分这两种依赖很有用。首先,窄依赖允许在一个集群节点上以流水线的方式(pipeline)计算所有父分区。例如,逐个元素地执行map、然后filter操作;而宽依赖则需要首先计算好所有父分区数据,然后在节点之间进行Shuffle,这与MapReduce类似。第二,窄依赖能够更有效地进行失效节点的恢复,即只需重新计算丢失RDD分区的父分区,而且不同节点之间可以并行计算;而对于一个宽依赖关系的Lineage图,单个节点失效可能导致这个RDD的所有祖先丢失部分分区,因而需要整体重新计算。

【误解】之前一直理解错了,以为窄依赖中每个子RDD可能对应多个父RDD,当子RDD丢失时会导致多个父RDD进行重新计算,所以窄依赖不如宽依赖有优势。而实际上应该深入到分区级别去看待这个问题,而且重算的效用也不在于算的多少,而在于有多少是冗余的计算。窄依赖中需要重算的都是必须的,所以重算不冗余。
 

转载:https://blog.csdn.net/houmou/article/details/

 

小讯
上一篇 2025-02-22 14:47
下一篇 2025-03-26 12:13

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/58230.html