RDD(Resilient Distributed Dataset,也叫分布式弹性数据集)是Spark的核心抽象,在实现层面,RDD是一个抽象类,每种RDD都需要实现这个接口,所以Spark有多种RDD,每种RDD的实现方式都不相同。

本文描述了RDD的基本概念和RDD的性质,每种性质的实现会后面的文章详细介绍。

概述

(Resilient Distributed Dataset) 弹性分布式数据集,又称RDD,是spark中数据的基本抽象,它是spark的核心。最早的rdd的设计思想可以参考论文:可伸缩性分布式数据集(Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing)。它代表一个可以并行操作的,不可修改的,分区元素的集合。

一个RDD是一个弹性的分布式记录集,它分布在一个或多个分区上。(可以把RDD和scala的collections 进行类比,不过scala的collections是在单个jvm上,而RDD是分布在多个执行节点上。)

Spark的RDD隐藏数据分区和数据分布,因此可以使用高级语言设计并行的计算框架。

RDD的基本特性

  • 弹性(Resilient)(容错性)

通过RDD血缘关系图(RDD lineage graph)来保证容错性。当由于节点宕机而导致计算失败,可以通过RDD的血缘关系图来重新计算丢失和损坏的分区。

  • 分布式(Distributed)

数据分布在集群的多个节点上。在计算RDD数据时,也会在多个节点上进行计算。

  • 不可变(Immutable)

RDD的数据一旦创建就不能修改,只能通过Transformations操作来创建新的RDD。

RDD的其他特性

RDD除了介绍的基本特性,RDD还具有以下特性:

  • 数据集(Dataset)

多个RDD可以构成一个数据集。数据集也是多个分区的集合,这些数据可能是主类型的值,或者是值的值。比如字符串的RDD,或者是数组的RDD。

  • 基于内存的(In-Memory)

RDD的数据尽可能多、尽可能长时间的保存在内存中。

  • 懒评估(Lazy evaluated)

RDD提供了两种类型的操作,一种操作叫:Transformation(转换);另一种叫:Action(动作)。当调用RDD的Transformation操作函数时不会立即执行,直到调用Action函数才开始执行。(RDD的这两种操作会在后面的文章中专门介绍)

  • 可以持久化

RDD的数据可以保存在缓存中,也可以持久化到硬盘。RDD提供了多种存储级别,包括:内存,磁盘,还可以在存储RDD时对RDD进行序列化操作。

  • 并行(Parallel)

RDD的数据处理是并行的。由于RDD的数据分布在多个节点上,这种性质决定了它可以并行执行数据处理任务。

  • 分区的(Partitioned)

RDD的数据是分区的,数据被分布在集群的多个节点上。

  • RDD是有的类型(Typed)

每个RDD都是有类型的,比如:RDD[Long]中的Long类型,RDD[(Int,String)]中的(Int, String)类型。

  • 本地粘性

RDD可以定义首选的位置,让计算过程尽可能接近数据分区所在的位置。

  • 相互依赖

调用一个RDD的Transformation操作时会生成新的RDD,新生成的RDD和来源RDD就有了依赖关系。而多个Transformation操作就形成了一个依赖的DAG图(有向无环图)。当这个DAG图上某个RDD的数据丢失或损坏时,可以根据该DAG图为依据来重新计算。

  • 其他说明

在RDD中,分区的计算被设计成一个分布式的过程,是为了实现数据的均匀分布以及利用数据本地化(如HDFS分布式系统的数据分区)。

分区是并行处理的单元,你可以通过重新分区(repartition)或合并转换(coalesce)来控制分区的数量。Spark试图尽可能靠近需要访问的数据,而不浪费时间通过RDD shuffling发送数据在网络上,创建的分区尽可能和存储系统的保持一致,从而优化数据访问。

RDD的操作类型

RDD支持两种操作:

  1. Transformations(转换)

RDD的转换操作由RDD的转换函数来实现,它们是懒操作函数(lazy operations functions),用来创建另一个RDD。之所以是lazy的,是由于,当调用它们时不会立即执行,只有等到actions函数执行时,才被执行。

  1. Actions(动作/操作)

当调用RDD的action函数时,将会触发计算,并返回计算结果。

小结

本文介绍了spark RDD的基本概念和RDD的特性。通过本文介绍应该对Spark的核心:RDD,有一个比较全面的了解。后面的文章会对这些特性的原理进行分析。