Spark支持将数据集放置在集群的缓存中,以便于数据重用。
Spark缓存策略对应的类:
class StorageLevel private( object StorageLevel { |
useDisk_ | 是否使用磁盘 |
useMemory_ | 是否使用内存 |
deserialized_ | 是否进行反序列化(即原生方式,不序列化) |
replication_ | 备份数目 |
序列化后的对象存放在内存中,占用的内存少,但是用时需要反序列化,会消耗CPU;
个人推荐:如果内存使用紧张但是CPU够用时建议考虑使用序列化后缓存;或者是选择性能更好的序列化工具。
可选用的存储级别有如下:
存储级别 | 描述 |
MEMORY_ONLY |
将RDD 作为反序列化的的对象存储JVM 中。如果RDD不能被内存装下,一些分区将不会被缓存,并且在需要的时候被重新计算。
这是是默认的级别
|
MEMORY_AND_DISK |
将RDD 作为反序列化的的对象存储在JVM 中。如果RDD不能被与内存装下,超出的分区将被保存在硬盘上,并且在需要时被读取
|
MEMORY_ONLY_SER |
将RDD 作为序列化的的对象进行存储(每一分区占用一个字节数组)。
通常来说,这比将对象反序列化的空间利用率更高,尤其当使用fast serializer,但在读取时会比较占用CPU
|
MEMORY_AND_DISK_SER |
与MEMORY_ONLY_SER 相似,但是把超出内存的分区将存储在硬盘上而不是在每次需要的时候重新计算
|
DISK_ONLY | 只将RDD 分区存储在硬盘上 |
DISK_ONLY_2等带2的 |
与上述的存储级别一样,但是将每一个分区都复制到两个集群结点上
|
注意:
1)spark默认存储策略为MEMORY_ONLY:只缓存到内存并且以原生方式存(反序列化)一个副本;
2)MEMORY_AND_DISK存储级别在内存够用时直接保存到内存中,只有当内存不足时,才会存储到磁盘中。
详细信息参见官方文档:http://spark.apache.org/docs/latest/programming-guide.html