spark论文阅读笔记(二)

来源:互联网 发布:php技术论坛 编辑:程序博客网 时间:2024/06/06 20:11

RDD中的宽依赖和窄依赖

spark中,系统通过一个通用接口来抽象地表示每个RDD,这个接口的内容包括:一组分区(partition),指向父RDD的依赖关系,一个可以从父RDD得到该RDD的计算函数,分区策略,数据位置。这里详细讲解一下依赖关系:

依赖关系被分为两种:

1、 窄依赖:

在这种依赖中,父RDD的一个分区最多只会被子RDD的一个分区使用,即父RDD的分区内数据是不可分割的,比如map操作,就是从一个父分区,直接映射到一个子分区。

spark论文阅读笔记(二)

2、 宽依赖:

即父 RDD 中一个分区内的数据会被分割,发送给子 RDD 的所有分区,如reduceByKey操作,因为该操作是把父RDD分区的不同key映射到子RDD的不同分区,故是宽依赖

spark论文阅读笔记(二)

一般来说,窄依赖的故障恢复要更快,例如:fileRDD 经历了 mapreduce以及filter 三次转换操作,得到了最终的 RDD,其中,mapfilter操作对应的依赖为窄依赖,reduce 操作对应的是宽依赖。spark论文阅读笔记(二)

假设最终 RDD 第一块分区内的数据因为某些原因丢失了,由于 RDD 内的每一个分区都会记录其对应的父 RDD 分区的信息,因此沿着下图所示的依赖关系往回走,就能找到该分区数据最终来源于 fileRDD的所有分区,再沿着依赖关系往后计算路径中的每一个分区数据,即可得到丢失的分区数据。spark论文阅读笔记(二)

同时也可以想象,如果一直是窄依赖,那么回复就不需要fileRDD的所有分区,而只需要其中一个,那么想必就会快上很多。


7月23日补充:

这里稍微更正一下之前的理解,之前认为窄依赖就是单纯的1:1关系,其实是有问题的,如下图

spark论文阅读笔记(二)
前3个图都是窄依赖(又称完全依赖,FullDependency),哪怕是一个N:N的关系,只要子RDD的分区(partition)的数据,来源于一个或多个完整的父RDD分区,那么就是窄依赖,反之,如果只来源于父RDD某个分区的1/2,那么就是宽依赖