关于cache()和persist()

/**
   * 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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值