天天看点

RDD概述什么是RDD?

什么是RDD?

RDD叫做弹性分布式数据集,是Spark中基本的数据抽象,代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面元素可并行计算的集合。

一、我相信大家最疑惑的就是“什么是弹性分布式数据集”弹性就是:

存储的弹性:内存与磁盘的自动切换
容错的弹性:数据丢失可以自动恢复
计算的弹性:计算出错重试机制
分片的弹性:可根据需要重新分片。

二、什么是不可变:

简单来说就是创建一个RDD如果更改,并不是真正意义上的更改,只是又创建了一个新的RDD

三、可分区:

这个的意思我想我不需要解释,可分区的意思就是能分区

四、并行计算

学过线程的都知道什么是

以上只是简单了解一下,接下来我把官方的解释给大家拿出来

RDD的属性

  1. 一组分区(Partition),即数据集的基本组成单位;
  2. 一个计算每个分区的函数;
  3. RDD 之间的依赖关系;
  4. 一个 Partitioner,即 RDD 的分片函数;
  5. 一个列表,存储存取每个 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)的每个分区都有关,是多对多的关系。

RDD概述什么是RDD?

缓存

如果在应用程序中多次使用同一个 RDD,可以将该 RDD 缓存起来,该 RDD 只有在第

一次计算的时候会根据血缘关系得到分区的数据,在后续其他地方用到该 RDD 的时候,会

直接从缓存处取而不用再根据血缘关系计算,这样就加速后期的重用。如下图所示,RDD- 1

经过一系列的转换后得到 RDD-n 并保存到 hdfs,RDD-1 在这一过程中会有个中间结果,

如果将其缓存到内存,那么在随后的 RDD-1 转换到 RDD-m 这一过程中,就不会计算其之

前的 RDD-0 了。

RDD概述什么是RDD?

CheckPoint

虽然 RDD 的血缘关系天然地可以实现容错,当 RDD 的某个分区数据失败或丢失,可

以通过血缘关系重建。但是对于长时间迭代型应用来说,随着迭代的进行,RDDs 之间的血

缘关系会越来越长,一旦在后续迭代过程中出错,则需要通过非常长的血缘关系去重建,势

必影响性能。为此,RDD 支持 checkpoint 将数据保存到持久化的存储中,这样就可以切断

之前的血缘关系,因为 checkpoint后的RDD 不需要知道它的父RDDs 了,它可以从 checkpoint

处拿到数据。

继续阅读