RDD的持久化

Spark最重要的一个功能,就是在不同操作间,持久化(或缓存)一个数据集在内存中。当你持久化一个RDD,每一个结点都将把它的计算分块结果保存在内存中,并在对此数据集(或者衍生出的数据集)进行的其它动作中重用。这将使得后续的动作(Actions)变得更加迅速(通常快10倍)。缓存是用Spark构建迭代算法的关键。
你可以用persist()或cache()方法来标记一个要被持久化的RDD,然后一旦首次被一个动作(Action)触发计算,它将会被保留在计算结点的内存中并重用。Cache有容错机制,如果RDD的任一分区丢失了,通过使用原先创建它的转换操作,它将会被自动重算(不需要全部重算,只计算丢失的部分)。当需要删除被持久化的RDD,可以用unpersistRDD()来完成该工作。
此外,每一个RDD都可以用不同的保存级别进行保存,从而允许你持久化数据集在硬盘,或者在内存作为序列化的Java对象(节省空间),甚至于跨结点复制。这些等级选择,是通过将一个org.apache.spark.storage.StorageLevel对象传递给persist()方法进行确定。cache()方法是使用默认存储级别的快捷方法,也就是StorageLevel.MEMORY_ONLY(将反序列化的对象存入内存)。
StorageLevel有五个属性,分别是:useDisk_是否使用磁盘,useMemory_是否使用内存,useOffHeap_是否使用堆外内存如:Tachyon,deserialized_是否进行反序列化,replication_备份数目。
完整的可选存储级别如下:

 
存储级别的选择
Spark的不同存储级别,旨在满足内存使用和CPU效率权衡上的不同需求。我们建议通过以下的步骤来进行选择:
?如果你的RDDs可以很好的与默认的存储级别(MEMORY_ONLY)契合,就不需要做任何修改了。这已经是CPU使用效率最高的选项,它使得RDDs的操作尽可能的快。?如果不行,试着使用MEMORY_ONLY_SER并且选择一个快速序列化的库使得对象在有比较高的空间使用率的情况下,依然可以较快被访问。
?
尽可能不要存储到硬盘上,除非计算数据集的函数,计算量特别大,或者它们过滤
了大量的数据。否则,重新计算一个分区的速度,和与从硬盘中读取基本差不多快。
总结:调用persist()或cache()方法使用的是MEMORY_ONLY存储级别,对于广播变量,使用的是MEMORY_AND_DISK存储级别。如果想使用其他存储级别,可以调用persist(StroageLevel)。MEMORY_AND_DISK存储级别时当内存足够时直接保存到内存队列中,当内存不足时,将释放掉不属于同一个RDD的block的内存。

更多精彩内容请关注:http://bbs.superwu.cn

关注超人学院微信二维码:

时间: 2025-01-10 23:40:08

RDD的持久化的相关文章

spark新能优化之多次使用RDD的持久化或checkPoint

如果程序中,对某一个RDD,基于它进行了多次transformation或者action操作.那么就非常有必要对其进行持久化操作,以避免对一个RDD反复进行计算. 此外,如果要保证在RDD的持久化数据可能丢失的情况下,还要保证高性能,那么可以对RDD进行Checkpoint操作.(也就是多次用到中间RDD的生成值时可以持久化再checkPoint(当持久化数据没的时候会去checkPoint中寻找,详细见spark源码.))

50.性能调优之重构RDD架构以及RDD持久化

本文为<Spark大型电商项目实战> 系列文章之一,主要介绍重构RDD及持久化的原因及方法,并在代码中实现优化. RDD架构重构与优化 一种情况是从一个RDD到几个不同的RDD,算子和计算逻辑其实是完全一样的,结果因为人为的疏忽计算了多次,获取到了多个RDD.所以尽量去复用RDD,差不多的RDD可以抽取称为一个共同的RDD,供后面的RDD计算时,反复使用. 公共RDD一定要实现持久化 当第一次对RDD2执行算子,获取RDD3的时候,就会从RDD1开始计算,就是读取HDFS文件,然后对RDD1执

spark调优(三):RDD重构和持久化

第一,RDD架构重构与优化 尽量去复用RDD,差不多的RDD,可以抽取称为一个共同的RDD,供后面的RDD计算时,反复使用. 第二,公共RDD一定要实现持久化 对于要多次计算和使用的公共RDD,一定要进行持久化. 持久化,也就是说,将RDD的数据缓存到内存中/磁盘中,(BlockManager),以后无论对这个RDD做多少次计算,那么都是直接取这个RDD的持久化的数据,比如从内存中或者磁盘中,直接提取一份数据. 第三,持久化,是可以进行序列化的 如果正常将数据持久化在内存中,那么可能会导致内存的

07、RDD持久化

Spark非常重要的一个功能特性就是可以将RDD持久化在内存中.当对RDD执行持久化操作时,每个节点都会将自己操作的RDD的partition持久化到内存中,并且在之后对该RDD的反复使用中,直接使用内存缓存的partition.这样的话,对于针对一个RDD反复执行多个操作的场景,就只要对RDD计算一次即可,后面直接使用该RDD,而不需要反复计算多次该RDD. 巧妙使用RDD持久化,甚至在某些场景下,可以将spark应用程序的性能提升10倍.对于迭代式算法和快速交互式应用来说,RDD持久化,是非

Spark笔记整理(五):Spark RDD持久化、广播变量和累加器

[TOC] Spark RDD持久化 RDD持久化工作原理 Spark非常重要的一个功能特性就是可以将RDD持久化在内存中.当对RDD执行持久化操作时,每个节点都会将自己操作的RDD的partition持久化到内存中,并且在之后对该RDD的反复使用中,直接使用内存缓存的partition.这样的话,对于针对一个RDD反复执行多个操作的场景,就只要对RDD计算一次即可,后面直接使用该RDD,而不需要反复计算多次该RDD. 巧妙使用RDD持久化,甚至在某些场景下,可以将spark应用程序的性能提升1

Spark 调优之RDD持久化级别及kryo序列化性能测试

我们上篇文章中讲了,RDD的持久化是spark优化中必须掌握的,并且,在内存不足的情况下,我们可以将持久化类型选择为MEMORY_ONLY_SER,减少内存的占用,持久化更多的partition,并且不同的序列化方法也会影响序列化性能.下面,我们就来测试下,持久化级别和序列化方法的选择对RDD持久化大小的影响.我选择了一个170.9MB的日志文件,传到了百度网盘 提取码:ffae 测试环境是windows,IDEA参数配置 MEMORY_ONLY 代码为 case class CleanedLo

[Berkeley]弹性分布式数据集RDD的介绍(RDD: A Fault-Tolerant Abstraction for In-Memory Cluster Computing 论文翻译)

摘要: 本文提出了分布式内存抽象的概念--弹性分布式数据集(RDD,Resilient Distributed Datasets).它同意开发者在大型集群上运行基于内存的计算.RDD适用于两种应用,而现有的数据流系统对这两种应用的处理并不高效:一是迭代式算法,这在图应用和机器学习领域非经常见.二是交互式数据挖掘工具.这两种情况下.将数据保存在内存中可以极大地提高性能.为了有效地实现容错,RDD提供了一种高度受限的共享内存,即RDD在共享状态的时候是基于粗粒度的转换而不是细粒度的更新(换句话说就是

spark之RDD

RDD 概念与特性 RDD是spark最重要的抽象.spark统一建立在抽象的RDD之上.设计一个通用的编程抽象,使得spark可以应对各种场合的大数据情景.RDD模型将不同的组件融合到一起,选用其中的几个/所有,可以应付各种不同的场景.解决了mr的缺陷 1. 弹性分布式数据集Resilient Distributed Dataset. 2. 只读分区数据集,final修饰的 3. 一个分布式的数据集合,是spark中的核心,spark的操作都是围绕RDD展开的. 4. 真正的运算是在各个计算节

spark 中的RDD编程 -以下基于Java api

1.RDD介绍:     RDD,弹性分布式数据集,即分布式的元素集合.在spark中,对所有数据的操作不外乎是创建RDD.转化已有的RDD以及调用RDD操作进行求值.在这一切的背后,Spark会自动将RDD中的数据分发到集群中,并将操作并行化. Spark中的RDD就是一个不可变的分布式对象集合.每个RDD都被分为多个分区,这些分区运行在集群中的不同节点上.RDD可以包含Python,Java,Scala中任意类型的对象,甚至可以包含用户自定义的对象. 用户可以使用两种方法创建RDD:读取一个