在spark中最重要的能力之一就是在多个操作中可以持久化(或者叫做缓存)一个数据集到内存中。当你持久化一个RDD,每个节点存储这个RDD的一部分,
并且在其他的action中重用这个结果集(或者这个结果集中抽取的数据)。这个行为让接下来的action变的更快(通常快10倍)。缓存是在迭代算法和快速交互中的关键工具
你可以使用persist()或者cache()方法来持久化RDD,第一次RDD是通过一个action计算而来的,它将在某些或者全部节点的内存中保存。spark的cache是容灾的--如果RDD中任何一个partition丢失,丢失部分将使用原来创建它的transformations来重新计算。
除此之外,每个RDD可以使用不同的存储级别来持久化RDD,例如,持久化数据集到硬盘,持久化数据集到内存并且使用java对象序列化的方式来存以节省内存、在多个节点间对数据集做冗余备份或者使用tachyon做off-head的存储。
这些等级是通过传入StorageLevel对象到persist()中实现的。这个cache方法是使用默认存储级别的快捷方法,默认是StorageLevel.MEMORY_ONLY(只在内存中存储非序列化的对象)
什么样的存储级别应该选择?
spark所提供多个存储级别意味着提供多种内存使用量和cpu效率的交易策略。我们推荐按使用下面的流程来选择一个:
* 如果你的RDD数据集可以使用默认的存储级别(MEMORY_ONLY),那就使用这个。这种设置是最能发挥cpu效率的选项,让基于RDD的操作尽可能最快速的运行。
* 。。
Removing Data
spark会自动监视在每个节点cache的使用情况,并且会通过LRU模式删除旧的数据。如果你想手动移除RDD而不是等待它自动从cache中移除,使用RDD.unpersist()方法即可。
参考
The on-heap store refers to objects that will be present in the Java heap (and also subject to GC).
On the other hand, the off-heap store refers to (serialized) objects that are managed by EHCache,
but stored outside the heap (and also not subject to GC).
As the off-heap store continues to be managed in memory,
it is slightly slower than the on-heap store, but still faster than the disk store.
()