Spark官方文档-Spark编程指南(第六节)

Spark官方文档-Spark编程指南(第六节)

RDD持久化

在不同操作之间将数据集持久化(或者缓存)在内存中是Spark最重要的能力之一。当你持久化一个RDD时,每个节点都会存储它在内存中计算的任何partitions,并且在其他actions中在那个数据集上(或者从它派生而来的数据集上)再次使用它们。这就使得后面的actions变得更快(通常超过10倍)。缓存对于迭代算法和快速交互应用是一个关键的工具。

你可以用方法persist()或者cache()将一个RDD标记为持久化的。第一次在一个action中被计算出来之后,它就会被保存在节点的内存中。Spark的缓存是可容错的-如果一个RDD的任何partition丢失了,通过最初被创建时使用的transformations,它会被自动重新计算出来。

另外,允许每个持久化的RDD用一个不同的存储等级来保存,例如,在磁盘上持久化数据集,以序列化Java对象(为了节约空间)的形式持久化在内存,跨越节点复制数据集。这些等级是通过给persist()传递一个StorageLevel对象(Scala, Java, Python)来设置的。方法cache()是使用默认存储等级-StorageLevel.MEMORY_ONLY(在内存中保存反序列化对象)的简写。完整的存储等级如下:

表格请查看原文:RDD Persistence

注意:在Python中,被存储起来的对象总是会用Pickle库序列化的,所以你是否选择序列化等级并没有关系。在Python中可用的存储等级包括MEMORY_ONLY, MEMORY_ONLY_2, MEMORY_AND_DISK, MEMORY_AND_DISK_2, DISK_ONLY和DISK_ONLY_2。

即使用户没有调用persist,Spark在shuffle操作(例如reduceByKey)中也会自动持久化一些中间数据。这样做是为了当一个节点在shuffle期间失败了,避免重复计算整个输入。我们仍然建议用户如果计划重复使用结果RDD,则要对其调用persist。

选择哪个存储等级?

Spark的存储等级意味着在内存开销和CPU效率之间提供不同的折衷。我们建议按如下过程来选择一个等级:

  • 如果你的RDDs正好与默认的存储等级(MEMORY_ONLY)匹配,则选择默认等级即可。这是CPU最高效的选择,允许对这些RDDs的操作运行得尽可能快。
  • 如果不行,则使用MEMORY_ONLY_SER并选择一个快速的序列化库来使得对象更加节省空间,但是仍然可以相当快速地访问。(Java和Scala)
  • 不要把数据存储到磁盘上,除非计算数据集的函数开销非常大,或者这些函数可以过滤掉大量数据。否则,重新计算一个partition可能与从磁盘读取它是一样快的。
  • 如果你想要快速错误恢复(例如使用Spark为来自web应用的请求提供服务)就使用replicated存储等级。所有存储等级都通过重新计算丢失的数据来提供完全的容错,但是replicated存储等级可以让你不用等待重新计算丢失的partition而继续在RDD上运行任务。

删除数据

Spark会自动监控各个节点上缓存的使用情况,并且按照最近最少使用(LRU)原则删掉旧的数据partitions。如果你想要人工删除一个RDD,而不是等待它自动被从缓存剔除,那么就使用方法RDD.unpersist()。

上一篇:Spark官方文档-Spark编程指南(第五节)

下一篇:Spark官方文档-Spark编程指南(第七节)

参考资料

本文译自Spark Programming Guide

发表评论

电子邮件地址不会被公开。 必填项已用*标注