spark缓存机制

第一次调用动作并计算出 RDD 内容后,RDD 的内容可以存储在集群的内存或磁盘上。

Spark 为持久化 RDD 定义了几种不同的机制,用不同的 StorageLevel 值表示。 rdd.cache() 是 rdd.persist(StorageLevel.MEMORY) 的简写,它将 RDD 存储为未序列化的 Java 对象。当 Spark 估计内存不够存放一个分区时,它干脆就不在内存中存放该分区,这样在下次需要时就必须重新计算。在对象需要频繁访问或低延访问时适合使用StorageLevel.MEMORY,因为它可以避免序列化的开销。相比其他选项, StorageLevel.MEMORY 的问题是要占用更大的内存空间。另外,大量小对象会对 Java 的垃圾回收造成压力,会导致程序停顿和常见的速度缓慢问题。


Spark 也提供了 MEMORY_SER 的存储级别,用于在内存中分配大字节缓冲区以存储 RDD序列化内容。如果使用得当(稍后会详细介绍),序列化数据占用的空间比未经序列化的数据占用的空间往往要少两到五倍。


Spark 也可以用磁盘来缓存 RDD。存储级别 MEMORY_AND_DISK 和 MEMORY_AND_DISK_SER分别类似于 MEMORY 和 MEMORY_SER。对于 MEMORY 和 MEMORY_SER,如果一个分区在内存里放不下,整个分区都不会放在内存。对于 MEMORY_AND_DISK 和 MEMORY_AND_DISK_SER,如果分区在内存里放不下, Spark 会将其溢写到磁盘上。


什么时候该缓存数据是门艺术,这通常需要对空间和速度进行权衡,垃圾回收开销的问题也会时不时让情况更复杂。一般情况下,如果多个动作需要用到某个 RDD,而它的计算代价又很高,那么就应该把这个 RDD 缓存起来 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值