/**
* Persist this RDD with the default storage level (`MEMORY_ONLY`).
*/
def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)
/**
* Persist this RDD with the default storage level (`MEMORY_ONLY`).
*/
def cache(): this.type = persist()
我们可以看出cache调用的就是persist方法,用的是MEMORY_ONLY级别的缓存。
class StorageLevel private(
private var _useDisk: Boolean, ##是否使用磁盘
private var _useMemory: Boolean,##是否使用内存
private var _useOffHeap: Boolean,##是否使用OffHeap
private var _deserialized: Boolean,## 是否反序列化
private var _replication: Int = 1)##默认副本数为1
extends Externalizable {
这是存储级别的结构
在sparkUI中可以看到
object StorageLevel {
val NONE = new StorageLevel(false, false, false, false)
val DISK_ONLY = new StorageLevel(true, false, false, false)
val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2)
val MEMORY_ONLY = new StorageLevel(false, true, false, true)## spark core默认的
val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2)
val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)
val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2)
val MEMORY_AND_DISK = new StorageLevel(true, true, false, true)
val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2)
val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false, false)
val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2)
val OFF_HEAP = new StorageLevel(true, true, true, false, 1)
unpersist()去掉缓存。执行缓存是lazy的,需要action触发。缓存不是lazy
常用级别:
MEMERY_ONLY 作为反序列化的java对象存在JVM中,如果RDD在内存中存不下,一些partition的数据不能被cache,他将会在你需要的时候重新计算(recomputed),这是一种默认的级别。
MEMERY_AND_DISK 写不进memory的partition写到磁盘,当需要的时候进行读取。
MEMERY_ONLY_SER 序列化后可以节省内存空间,但是耗cpu读取,one byte array per partition,一个分区一个字节数组,比反序列化的节省空间。
做好使用MEMERY_ONLY,如果这个级别满足不了,可以使用MEMERY_ONLY_SER然后selecting a fast serialization library 让对象更节省空间,同时具有不错的处理速度。不要写到磁盘,除非用来计算你数据集的函数非常耗费。否则重新计算分区的速度有可能比你读取磁盘的速度更快。
removing data
spark后自动的监控你每个节点上的cache的使用情况,然后以 least-recently-used(LRU) 的方式移除就得分区数据,当然也可以使用unpersist(true)