spark 持久化机制入门

持久化作原因及用途

  • 默认是在内存中持久化.

  • 当您持久化RDD时,每个节点都将它计算的所有分区存储在内存中,并在该数据集(或从该数据集派生的数据集)上的其他操作中重用这些分区。

  • 这使得未来的行动更快(通常是10倍以上)。缓存是迭代算法和快速交互使用的关键工具。

  • 可以使用persist()或cache()方法将RDD标记为持久化。

  • 第一次在action中计算它时,它将保存在节点上的内存中。

  • Spark的缓存是容错的——如果RDD的任何分区丢失,它将自动使用最初创建它的转换重新计算。

持久化级别

  • 每个持久化的RDD都可以使用不同的存储级别进行存储,例如,允许您在磁盘上持久化数据集,将其持久化到内存中,但作为序列化的Java对象(以节省空间),跨节点复制它。这些级别是通过向persist()传递一个StorageLevel对象(Scala、Java、Python)来设置的。cache()方法是使用默认存储级别的简写,它是仅限StorageLevel.MEMORY(将反序列化的对象存储在内存中)。

有以下级别可以选择
在这里插入图片描述

如何选择存储级别

Spark的存储级别旨在提供内存使用CPU效率之间的不同权衡。我们建议通过以下过程选择一个:

如果您的RDD适合默认存储级别(仅限内存),那么就让它们这样。这是CPU效率最高的选项,允许RDD上的操作尽可能快地运行。

如果没有,请尝试使用MEMORY-ONLY\u-user并选择一个快速序列化库,以使对象更节省空间,但访问速度仍然相当快。(Java和Scala)

不要溢出到磁盘,除非计算数据集的函数很昂贵,或者它们过滤了大量数据。否则,重新计算一个分区可能和从磁盘读取它一样快。

如果您希望快速故障恢复(例如,如果使用Spark服务来自web应用程序的请求),请使用复制的存储级别。所有存储级别都通过重新计算丢失的数据来提供完全的容错能力,但是复制的存储级别允许您继续在RDD上运行任务,而无需等待重新计算丢失的分区。

删除缓存

Spark自动监视每个节点上的缓存使用情况,并以最近最少使用(least recent used,LRU)的方式删除旧的数据分区。如果要手动删除RDD,而不是等待它从缓存中退出,请使用 RDD.unpersist()方法。请注意,此方法在默认情况下不会阻止。要在释放资源之前阻止,请在调用此方法时指定blocking=true。

应用

在写代码中,可以用persist或者cache方法,cache方法就是调用了persist方法.

//这二者的默认级别都是MEMORY_ONLY
rdd.cache()//cache方法不可以带参数
rdd.persist()
//persist方法还可以自定义指定级别
rdd.persist(StorageLevel.MEMORY_AND_DISK)
rdd.persist(StorageLevel.MEMORY_ONLY_SER)
//cache和persist都可以用unpersist来取消
rdd.unpersist()

参考

RDD中cache和persist的区别_helloxiaozhe的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值