spark中的RDD集合详解及缓存持久化

263 阅读5分钟

什么是RDD

RDD(Resilient Distributed Dataset),叫做弹性分布式数据集,是 Spark 中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。在 Spark 中,对数据的所有操作不外乎创建RDD、转化已有 RDD 以及调用RDD操作进行求值。每个 RDD 都被分为多个分区,这些分区运行在集群中的不同节点上。RDD可以包含Python、Java、Scala中任意类型的对象,甚至可以包含用户自定义的对象。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD 允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。

RDD 支持两种操作:转化Transformation操作行动Action操作。RDD 的Transformation操作是返回一个新的 RDD 的操作,比如 map() 和 fifilter(),而Action操作则是向驱动器程序返回结果或把结果写入外部系统的操作。比如 count() 和 fifirst()。Spark 采用惰性计算模式,RDD只有第一次在一个行动操作中用到时,才会真正计算。Spark可以优化 整个计算过程。默认情况下,Spark的RDD会在你每次对它们进行行动操作时重新计算。如果想在多个 行动操作中重用同一个RDD,可以使用 RDD.persist() 让 Spark 把这个 RDD 缓存下来。 可以从三个方面来理解:

1、只读数据集DataSet:

故名思议,RDD是数据集合的抽象,是复杂物理介质上存在数据的一种逻辑 视图。从外部来看,RDD的确可以被看待成经过封装,带扩展特性(如容错性)的数据集合。RDD是只 读的,要想改变RDD中的数据,只能在现有的RDD基础上创建新的 RDD。由一个RDD转换到另一个 RDD,可以通过丰富的操作算子实现,不再像MapReduce那样只能写 map 和 reduce 了。

图片.png

2、分布式Distributed/分区:

RDD的数据可能在物理上存储在多个节点的磁盘或内存中,也就是所谓 的多级存储。RDD 逻辑上是分区的,每个分区的数据是抽象存在的,计算的时候会通过一个compute 函数得到每个分区的数据。如果 RDD 是通过已有的文件系统构建,则 compute 函数是读取指定文件系 统中的数据,如果 RDD 是通过其他 RDD 转换而来,则 compute 函数是执行转换逻辑将其他 RDD 的 数据进行转换。

3、弹性Resilient:

虽然 RDD 内部存储的数据是只读的,但是,我们可以去修改(例如通过repartition 转换操作)并行计算单元的划分结构,也就是分区的数量。

Spark的RDD的弹性:

1、存储的弹性: 内存和磁盘的自动切换

2、容错的弹性: 数据丢失可以自动恢复

3、计算的弹性: 计算出错重试机制

4、分片的弹性: 根据需要重新分片

1、自动进行内存和磁盘数据存储的切换

Spark优先把数据放到内存中,如果内存放不下,就会放到磁盘里面,程序进行自动的存储切换。

2、基于血统的高效容错机制

在RDD进行转换和动作的时候,会形成RDD的Lineage依赖链,当某一个RDD失效的时候,可以通过重新计算上游的RDD来重新生成丢失的RDD数据,从而实现高可用容错性,保证数据不丢失。

3、Task如果失败会自动进行特定次数的重试

RDD的计算任务如果运行失败,会自动进行任务的重新计算,默认次数是4次。

4、Stage如果失败会自动进行特定次数的重试

如果Job某个Stage阶段计算失败,框架也会自动进行任务的重新计算,默认次数也是4次。

5、Checkpoint和Persist可主动或被动触发

RDD可以通过Persist持久化将RDD缓存到内存或者磁盘,当再次用到该RDD时直接读取就行。也可以将RDD进行检查点,检查点会将数据存储在HDFS中,该RDD的所有父RDD依赖都会被移除。

图片.png

图片.png

RDD的Persist持久化和cache缓存介绍,可以通过看scala的源码cache缓存操作底层具体的是persist

1609657988495.png

在设置缓存的时候可以进行设置具体的缓存操作,如:只缓存至磁盘,缓存至内存等

图片.png

RDD的Checkpoint介绍:

图片.png

1609659230103.png 缓存/持久化和Checkpoint检查点的区别

1.存储位置
缓存/持久化数据存默认存在内存, 一般设置为内存+磁盘(普通磁盘)Checkpoint检查点:一般存储在HDFS

2.功能 缓存/持久化:保证数据后续使用的效率高Checkpoint检查点:保证数据安全/也能一定程度上提高效率

3.对于依赖关系: 缓存/持久化:保留了RDD间的依赖关系Checkpoint检查点:不保留RDD间的依赖关系

4.开发中如何使用? 对于计算复杂且后续会被频繁使用的RDD先进行缓存/持久化,再进行Checkpoint

6、数据调度弹性

Spark把这个Job执行模型抽象为通用的有向无环图DAG,可以将多Stage的任务串联或并行执行,调度引擎自动处理Stage的失败以及Task的失败。

7、数据分片的高度弹性

可以根据业务的特征,动态调整数据分片的个数,提升整体的应用执行效率。