什么是RDD?
RDD叫做弹性分布式数据集,是Spark中基本的数据抽象,代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面元素可并行计算的集合。
一、我相信大家最疑惑的就是“什么是弹性分布式数据集”弹性就是:
存储的弹性:内存与磁盘的自动切换
容错的弹性:数据丢失可以自动恢复
计算的弹性:计算出错重试机制
分片的弹性:可根据需要重新分片。
二、什么是不可变:
简单来说就是创建一个RDD如果更改,并不是真正意义上的更改,只是又创建了一个新的RDD
三、可分区:
这个的意思我想我不需要解释,可分区的意思就是能分区
四、并行计算
学过线程的都知道什么是
以上只是简单了解一下,接下来我把官方的解释给大家拿出来
RDD的属性
- 一组分区(Partition),即数据集的基本组成单位;
- 一个计算每个分区的函数;
- RDD 之间的依赖关系;
- 一个 Partitioner,即 RDD 的分片函数;
- 一个列表,存储存取每个 Partition 的优先位置(preferred location)。
RDD的特点
RDD 表示只读的分区的数据集,对 RDD 进行改动,只能通过 RDD 的转换操作,由一个 RDD 得到一个新的 RDD,新的 RDD 包含了从其他 RDD 衍生所必需的信息。RDDs 之间存在依赖,RDD 的执行是按照血缘关系延时计算的。如果血缘关系较长,可以通过持久化RDD 来切断血缘关系。
弹性:
存储的弹性:内存与磁盘的自动切换;
容错的弹性:数据丢失可以自动恢复;
计算的弹性:计算出错重试机制;
分片的弹性:可根据需要重新分片。
分区:
RDD 逻辑上是分区的,每个分区的数据是抽象存在的,计算的时候会通过一个 compute
函数得到每个分区的数据。如果 RDD 是通过已有的文件系统构建,则 compute 函数是读取
指定文件系统中的数据,如果 RDD 是通过其他 RDD 转换而来,则 compute 函数是执行转
换逻辑将其他 RDD 的数据进行转换。
只读:
由一个 RDD 转换到另一个 RDD,可以通过丰富的操作算子实现,不再像 MapReduce
那样只能写 map 和 reduce 了。
RDD 的操作算子包括两类,一类叫做 transformations,它是用来将 RDD 进行转化,构
建 RDD 的血缘关系;另一类叫做 actions,它是用来触发 RDD 的计算,得到 RDD 的相关计
算结果或者将 RDD 保存的文件系统中。
依赖
RDDs 通过操作算子进行转换,转换得到的新 RDD 包含了从其他 RDDs 衍生所必需的
信息,RDDs 之间维护着这种血缘关系,也称之为依赖。如下图所示,依赖包括两种,一种
是窄依赖,RDDs 之间分区是一一对应的,另一种是宽依赖,下游 RDD 的每个分区与上游
RDD(也称之为父 RDD)的每个分区都有关,是多对多的关系。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csgXR6hlcOdVWw40MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxcDNzUjNyEjM5ETMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
缓存
如果在应用程序中多次使用同一个 RDD,可以将该 RDD 缓存起来,该 RDD 只有在第
一次计算的时候会根据血缘关系得到分区的数据,在后续其他地方用到该 RDD 的时候,会
直接从缓存处取而不用再根据血缘关系计算,这样就加速后期的重用。如下图所示,RDD- 1
经过一系列的转换后得到 RDD-n 并保存到 hdfs,RDD-1 在这一过程中会有个中间结果,
如果将其缓存到内存,那么在随后的 RDD-1 转换到 RDD-m 这一过程中,就不会计算其之
前的 RDD-0 了。
CheckPoint
虽然 RDD 的血缘关系天然地可以实现容错,当 RDD 的某个分区数据失败或丢失,可
以通过血缘关系重建。但是对于长时间迭代型应用来说,随着迭代的进行,RDDs 之间的血
缘关系会越来越长,一旦在后续迭代过程中出错,则需要通过非常长的血缘关系去重建,势
必影响性能。为此,RDD 支持 checkpoint 将数据保存到持久化的存储中,这样就可以切断
之前的血缘关系,因为 checkpoint后的RDD 不需要知道它的父RDDs 了,它可以从 checkpoint
处拿到数据。