概述
RDD是spark的基础,本文描述了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是分布在多个jvm上。)
spark的rdd隐藏数据分区和数据分布,因此可以使用高级语言设计并行的计算框架。
RDD的基本特性
- 弹性(Resilient)(容错性)
通过RDD血缘关系图(RDD lineage graph)来保证容错性。当由于节点宕机而导致计算失败,可以通过RDD的血缘关系图来重新计算丢失和损坏的分区。
- 分布式(Distributed)
数据分布在集群的多个节点上。
- 不可变(Immutable)
RDD的数据一旦创建就不能修改,只能通过transformations函数创建新的RDD。
RDD的其他特性
RDD除了介绍的基本特性,RDD还具有以下特性:
- 数据集(Dataset)
多个RDD可以构成一个数据集。数据集是多个分区的集合,这些数据可能是主类型的值,或者是值的值。比如字符串的RDD,或者是数组的RDD。
- 基于内存的(In-Memory)
RDD的数据尽可能多、尽可能长时间的保存在内存中。
- 懒评估(Lazy evaluated)
transformations函数不会执行,直到执行action函数。(RDD的这两种函数后面会有文章专门讲解)
- 可以持久化:
RDD的数据可以保存在缓存中,也可以持久化到硬盘。
- 并行(Parallel)
RDD的数据处理是并行的。
- 分区的(Partitioned)
RDD的数据是分区的,数据被分布在集群的多个节点上。
- RDD是类型(Typed)
每个RDD都是有类型的,比如:RDD[Long]中的Long类型,RDD[(Int,String)]中的(Int, String)类型。
- 本地粘性
RDD可以定义首选的位置,让计算过程尽可能接近数据分区。
- 其他说明
在RDD中,分区的计算被设计成一个分布式的过程,是为了实现数据的均匀分布以及利用数据本地化(如HDFS分布式系统的数据分区)。
分区是并行处理的单元,你可以通过重新分区(repartition)或合并转换(coalesce)来控制分区的数量。
spark试图尽可能靠近需要访问的数据,而不浪费时间通过RDD shuffling发送数据在网络上,创建的分区尽可能和存储系统的保持一致,从而优化数据访问。
RDD的操作类型
RDDS支持两种操作:
- transformations(转换)
RDD的转换操作由RDD的转换函数来实现,它们是懒操作函数(lazy operations functions),用来返回另一个RDD。
之所以是lazy的,是由于,当调用它们时不会立即执行,只有等到actions函数执行时,才被执行。
- actions(动作/操作)
当调用RDD的action函数时,将会触发计算,并返回计算结果。
总结
本文介绍了spark RDD的基本概念和RDD的特性。通过本文介绍应该对Spark的核心:RDD有一个比较全面的了解。