Spark编程模型(二):RDD简介

    RDD是Spark应用开发过程中最为基本也是最为重要的一类数据结构,RDD被定义为只读、分区化的记录集合,更为通俗来讲,RDD是对原始数据的进一步封装,封装导致两个结果:第一个结果是数据访问权限被限制,数据只能被读,而无法被修改;第二个结果是数据操作功能被强化,使得数据能够实现分布式存储、并发处理、自动容错等诸多功能。Spark的整个计算过程都是围绕数据集RDD来进行。

    4.1 RDD的两类来源

    (1)将未被封装的原始数据进行封装得到,根据原始数据的存在形式,又可以被进一步分成由集合并行化获得或从外部数据集中获得。

    (2)由其他RDD通过转换操作而得,由于RDD的只读特性,内部的数据无法被修改,因此RDD内部提供了一系列内部数据转换(Transformation)操作接口,这类接口可以返回新的RDD,而不影响原有的RDD内容。

    4.2 RDD的内部数据结构

    (1)分区信息列表

    (2)对父RDD的依赖信息

    (3)对Key-Value键值对数据类型的分区器(可选)

    (4)每个数据分区的物理地址列表(可选)

        RDD的数据操作并非在调用内部接口的一刻便开始计算,而是遇到要求将数据返回驱动程序,或者写入到文件的接口时,才会进行真正的计算,这类会触发计算的操作成为(Action)操作,而这种延时计算的特征,别称为RDD计算的惰性(Lazy)。

        在Spark当中,数据被使用的频率越高,性能提升越明显,数据的内存化操作在RDD层次上,体现为RDD的持久化操作。除此之外,RDD还提供类似于持久化操作的检查点机制。

    4.2 RDD转换操作

        转换(Transformation)操作是由个RDD转换成另一个新的RDD。

 Spark编程模型(二):RDD简介

Spark编程模型(二):RDD简介

    4.3 RDD动作操作

        相对于转换,动作(Action)操作用于向驱动(Driver)程序返回值将值写入到文件中。

        Spark编程模型(二):RDD简介

    4.4 RDD持久化

        惰性计算的缺陷也是明显的:中间数据默认不会保存,每次动作操作都会对数据重复计算,某些计算量比较大的操作可能会影响到系统的运算效率,因此Spark允许将转换过程中手动将某些会被频繁使用的RDD执行持久化操作,持久化后的数据可以被存储在内存、磁盘或者Tachyon当中,这将使得后续的动作(Actions)变得更加迅速(通常快10倍)。

    通过调用RDD提供的cache或persist函数即可实现数据的持久化,persist函数需要指定存储级别(StorageLevel),cache等价于采用默认存储级别的persist函数,Spark提供的存储级别及其含义如表所示。

Spark编程模型(二):RDD简介

    4.5 RDD检查点

         因为DAG中血统(lineage)如果太长,当重计算的时候开销会很大,故使用检查点机制,将计算过程持久化到磁盘,这样如果出现计算故障的时候就可以在检查点开始重计算,而不需要从头开始。RDD的检查点(Checkpoint)机制类似持久化机制中的persist(StorageLevel.DISK_ONLY),数据会被存储在磁盘当中,两者最大的区别在于:持久化机制所存储的数据,在驱动程序运行结束之后会被自动清除;检查点机制则会将数据永久存储在磁盘当中,如果不手动删除,数据会一直存在。换句话说,检查点机制存储的数据能够被下一次运行的应用程序所使用。

        检查点的使用与持久化类似,调用RDD的checkpoint方法即可。