Spark:持久化存储等级选取策略 /persist() / cache() /Storage Level

那么我们应该如何选取持久化的存储级别呢?

实际上存储级别的选取就是Memory与CPU之间的双重权衡,可以参考下述内容:

(1)如果RDD的数据量对于集群内存容量压力较小,可以很好地兼容默认存储级别(MEMORY ONLY),那么优先使用它,这是CPU工作最为高效的种方式, 可以很好地提高运行速度。

(2)如果(1)不能满足,即集群的内存资源相较于cpu资源十分匮乏,则尝试使用MEMORY_ ONLY_ SER,且选择一种快速 的序列化工具,也可以达到一种不错的效果。

(3)一般情况下不要把数据持久化到磁盘, 除非计算是非常“昂贵”的或者计算过程会过滤掉大量数据,因为重新计算一个 分区数据的速度可能要高于从磁盘读取一个分区数据的速度。

(4)如果需要快速的失败恢复机制,则使用备份的存储级别,如MEMORY_ONLY_2.MEMORY_AND_DISK_2;虽然所有的存储级别都可以通过重新计算丢失的数据实现容错,但是备份机制使得大部分情况下应用无须中断,即数据丢失情况下,直接使用备份数据,而不需要重新计算数据的过程;

(5)如果处于大内存或多应用的场景下,OFF_ HEAP可以带来以下的好处:

它允许Spark Executors可以共享Tachyon的内存数据;

它在很大程度上减少JVM垃圾回收带来的性能开销;

Spark Executors故障不会导致数据丢失。

如果要缓存的数据太多,内存中放不下,Spark 会自动利用最近最少使用(LRU)的缓存策略把最老的分区从内存中移除。对于仅把数据存放在内存中的缓存级别,下一次要用到已经被移除的分区时,这些分区就需要重新计算。但是对于使用内存与磁盘的缓存级别的分区来说,被移除的分区都会写入磁盘。不论哪种情况,都不必担心你的作业因 为缓存了太多数据而被打断。不过,缓存不必要的数据会导致有用的数据被移出内存,带来更多重算的时间开销。最后,RDD还有一个方法叫作unpersist(), 调用该方法可以手动把持久化的RDD从缓存中移除。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章