spark学习笔记(1)---对RDD的理解 RDD 是什么? RDD 5大特性 RDD 的分区 RDD 依赖关系 参考资料

RDD全称Resilient Distributed Dataset,光看名字并不能理解它到底是个什么东西,其实,我们可以就把它当做是一个分布式的容器,每个容器都有很多的分区,一般情况下每个分区在不同的机器上。对RDD的操作就是对每个分区的操作。如下图

spark学习笔记(1)---对RDD的理解
RDD 是什么?
RDD 5大特性
RDD 的分区
RDD 依赖关系
参考资料

  • RDD 5大特性

在RDD的源码中,我们可以看到下面一段

* Internally, each RDD is characterized by five main properties:*
* - A list of partitions
* - A function for computing each split
* - A list of dependencies on other RDDs
* - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
* - Optionally, a list of preferred locations to compute each split on (e.g. block locations for* an HDFS file)

1.一个有多个分区的列表,就如同我们刚刚所说的,RDD就是一个有很多分区的容器,一般情况下每个分区在不同的机器上。
2.对于每一个切片(分区),是使用同一个函数在计算,如上图所示,每一个分区独立计算,而且他们计算的函数是相同的(当然这里指的是同一阶段)。
3.每个RDD都依赖于其父RDD,上图中计算后的RDD就依赖于其父RDD。
4.可选的,对于key-value类型的RDD,存在一个Partitioner(划分器)。(也就是它形成宽窄依赖)。(划分器目前有两种,一种是HashPatitioner,根据key的 hash值将RDD划分到不同的分区,另一种是RangePartitioner,根据key的范围值划分到不同分区)。
5.可选的,对于每一个切片(分区),都会选择一个尽可能近的来计算,减少网络传输。例如,HadoopRDD分区的首选位置就是HDFS块所在的节点。

  • RDD 的分区

前面一直在说RDD的分区,RDD的分区到底是什么?每个RDD的分区都分布在集群的节点中,分区的多少涉及对这个RDD进行并行计算的粒度。其实,分区是一个逻辑概念,变换前后的新旧分区在物理上可能是同一块内存或存储。用户可以指定分区数,如果没有指定的话为默认值,默认值是该程序分配到的CPU核数,如果从HDFS文件创建,默认为文件的数据块数。

 

  • RDD 依赖关系

在RDD中将依赖关系分成了两种类型:窄依赖(Narrow Dependencies)和宽依赖(Wide Dependencies),如下图。窄依赖是指每个父RDD的分区都至多被一个子RDD的分区使用,而宽依赖是多个子RDD的分区依赖一个父RDD的分区。

spark学习笔记(1)---对RDD的理解
RDD 是什么?
RDD 5大特性
RDD 的分区
RDD 依赖关系
参考资料

那么为什么要划分这两种依赖呢?

1.窄依赖允许在单个集群节点上流水线式执行,这个节点可以计算所有父级分区。例如,可以逐个元素地依次执行filter操作和map操作,这个节点可以计算所有父级分区。相反,宽依赖需要所有的父RDD数据可用,并且数据已经通过类MapReduce的操作shuffle完成。

2.在窄依赖中,节点失败后的恢复更加高效。因为只有丢失的父级分区需要重新计算,并且这些丢失的父级分区可以并行地运行在不同节点上重新计算。相反,在宽依赖的继承关系中,单个失败的节点可能导致一个RDD的所有先祖RDD中的一些分区丢失,导致计算的重新执行。

划分宽窄依赖,也是后面我们会看到的根据job切分stage的一个重要依据。

进一步理解宽依赖和窄依赖

对于WordCount程序

spark学习笔记(1)---对RDD的理解
RDD 是什么?
RDD 5大特性
RDD 的分区
RDD 依赖关系
参考资料

  • 参考资料

《图解spark:核心技术与案例》 郭景瞻  博客  http://www.cnblogs.com/shishanyuan/