[Spark]Spark RDD 指南五 持久化

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 1. 概述Spark中最重要的功能之一是操作时在内存中持久化(缓存)数据集(persisting (or caching) a dataset in memory across operations)。

1. 概述

Spark中最重要的功能之一是操作时在内存中持久化(缓存)数据集(persisting (or caching) a dataset in memory across operations)。当我们让Spark持久化存储一个RDD时,每个节点都会将其计算的任何分区存储在内存中,并将其重用于该数据集(或从其派生的数据集)的其他行动操作(each node stores any partitions of it that it computes in memory and reuses them in other actions on that dataset (or datasets derived from it))。这样可以使以后的动作操作执行的更快(通常超过10倍)。 缓存是迭代算法和快速交互使用的关键工具。

可以使用RDD上的persist()cache()方法来标记要持久化的RDD(执行persist和cache方法不会持久化RDD)。 当RDD第一次在动作操作中计算时,它将持久化(缓存)到节点的内存中。Spark的缓存是可容错的 - 如果RDD的任何分区丢失,它将使用最初创建的转换操作自动重新计算。

2. 存储级别

除此之外,可以使用不同的持久化级别来存储每个持久化的RDD,从而允许你将数据集保留在磁盘上,或者将其以序列化的Java对象存储在内存中(以节省空间),或者将其复制到所有节点上( to persist the dataset on disk, persist it in memory but as serialized Java objects (to save space), replicate it across nodes)。通过将StorageLevel对象传递给persist()方法来设置持久化级别。 cache()方法使用默认存储级别,即StorageLevel.MEMORY_ONLY

持久化级别 说明
MEMORY_ONLY 将RDD以非序列化的Java对象存储在JVM中。 如果没有足够的内存存储RDD,则某些分区将不会被缓存,每次需要时都会重新计算。 这是默认级别。
MEMORY_AND_DISK 将RDD以非序列化的Java对象存储在JVM中。如果数据在内存中放不下,则溢写到磁盘上.需要时则会从磁盘上读取
MEMORY_ONLY_SER (Java and Scala) 将RDD以序列化的Java对象(每个分区一个字节数组)的方式存储.这通常比非序列化对象(deserialized objects)更具空间效率,特别是在使用快速序列化的情况下,但是这种方式读取数据会消耗更多的CPU。
MEMORY_AND_DISK_SER (Java and Scala) MEMORY_ONLY_SER类似,但如果数据在内存中放不下,则溢写到磁盘上,而不是每次需要重新计算它们。
DISK_ONLY 将RDD分区存储在磁盘上。
MEMORY_ONLY_2, MEMORY_AND_DISK_2等 与上面的储存级别相同,只不过将持久化数据存为两份,备份每个分区存储在两个集群节点上。
OFF_HEAP(实验中) MEMORY_ONLY_SER类似,但将数据存储在堆内存中。 这需要启用堆内存。

备注

在Python中,存储对象将始终使用Pickle库进行序列化,持久化级别默认值就是以序列化后的对象存储在JVM堆空间中,因此选择什么样的序列化级别是无关紧要的。 当我们把数据写到磁盘或者堆外存储上时,也总是使用序列化后的数据.Python中的可用存储级别包括MEMORY_ONLYMEMORY_ONLY_2MEMORY_AND_DISKMEMORY_AND_DISK_2DISK_ONLYDISK_ONLY_2

在Shuffle操作中(例如,reduceByKey),即使用户没有主动对数据进行持久化,Spark也会对一些中间数据进行持久化。 这样做是为了避免重新计算整个输入,如果一个节点在Shuffle过程中发生故障。 如果要重用,我们仍然建议用户对生成的RDD进行持久性。

3. 选择存储级别

Spark的存储级别旨在提供内存使用率和CPU效率之间的不同权衡。 我们建议通过以下过程来选择一个:

  • 如果你的RDD适合于默认存储级别(MEMORY_ONLY),那就保持不动。 这是CPU效率最高的选项,允许RDD上的操作尽可能快地运行。
  • 如果不是,请尝试使用MEMORY_ONLY_SER并选择一个快速的序列化库,这种方式更加节省空间,并仍然能够快速访问。 (Java和Scala)
  • 不要溢写到磁盘,除非在数据集上的计算操作成本较高,或者需要过滤大量的数据。 否则,重新计算分区可能与从磁盘读取分区一样快。
  • 如果要快速故障恢复(例如,使用Spark为Web应用程序提供服务),请使用副本存储级别replicated storage levels。 所有存储级别通过重新计算丢失的数据来提供完整的容错能力,但副本数据可让你继续在RDD上运行任务,而无需重新计算丢失的分区。

4. 清除数据

Spark会自动监视每个节点的缓存使用情况,并以最近最少使用(LRU)方式丢弃旧的数据分区。 如果您想手动删除RDD,而不是等待它自动从缓存中删除,请使用RDD.unpersist()方法。

原文:http://spark.apache.org/docs/latest/programming-guide.html#rdd-persistence

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
1月前
|
存储 分布式计算 并行计算
【赵渝强老师】Spark中的RDD
RDD(弹性分布式数据集)是Spark的核心数据模型,支持分布式并行计算。RDD由分区组成,每个分区由Spark Worker节点处理,具备自动容错、位置感知调度和缓存机制等特性。通过创建RDD,可以指定分区数量,并实现计算函数、依赖关系、分区器和优先位置列表等功能。视频讲解和示例代码进一步详细介绍了RDD的组成和特性。
|
2月前
|
SQL 消息中间件 分布式计算
大数据-84 Spark 集群 RDD创建 RDD-Transformation操作算子 详解(一)
大数据-84 Spark 集群 RDD创建 RDD-Transformation操作算子 详解(一)
50 5
|
2月前
|
分布式计算 大数据 数据处理
大数据-84 Spark 集群 RDD创建 RDD-Transformation操作算子 详解(二)
大数据-84 Spark 集群 RDD创建 RDD-Transformation操作算子 详解(二)
51 4
|
2月前
|
存储 缓存 分布式计算
大数据-83 Spark 集群 RDD编程简介 RDD特点 Spark编程模型介绍
大数据-83 Spark 集群 RDD编程简介 RDD特点 Spark编程模型介绍
44 4
|
1月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
2月前
|
存储 缓存 分布式计算
大数据-89 Spark 集群 RDD 编程-高阶 编写代码、RDD依赖关系、RDD持久化/缓存
大数据-89 Spark 集群 RDD 编程-高阶 编写代码、RDD依赖关系、RDD持久化/缓存
47 4
|
2月前
|
JSON 分布式计算 大数据
大数据-85 Spark 集群 RDD创建 RDD-Action Key-Value RDD详解 RDD的文件输入输出
大数据-85 Spark 集群 RDD创建 RDD-Action Key-Value RDD详解 RDD的文件输入输出
38 1
|
2月前
|
分布式计算 Java 大数据
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
43 0
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
|
2月前
|
消息中间件 分布式计算 Kafka
大数据-99 Spark 集群 Spark Streaming DStream 文件数据流、Socket、RDD队列流
大数据-99 Spark 集群 Spark Streaming DStream 文件数据流、Socket、RDD队列流
36 0
|
2月前
|
SQL 分布式计算 大数据
大数据-94 Spark 集群 SQL DataFrame & DataSet & RDD 创建与相互转换 SparkSQL
大数据-94 Spark 集群 SQL DataFrame & DataSet & RDD 创建与相互转换 SparkSQL
75 0