Spark缓存级别

Spark缓存级别

在spark中,如果一个rdd或者Dataset被多次复用,最好是对此做缓存操作,以避免程序多次进行重复的计算。Spark 的缓存具有容错机制,如果一个缓存的 RDD 的某个分区丢失了,Spark 将按照原来的计算过程,自动重新计算并进行缓存。

缓存的使用:

	val dataset = spark.read.parquet(file)
	dataset.cache()
	或者:dataset.persist()

cache() 跟 persist() 实际上是一样的,都是MEMORY_AND_DISK级别。

如果想要控制缓存级别,则需要在persist()中加上你需要缓存的级别,如:

dataset.persist(StorageLevel.MEMORY_ONLY)

缓存的释放:

dataset.unpersist()
dataset.unpersist(true) //true 指定的是是否阻塞进程,直到所有block都被删除。

注意:如果要对某个缓存进行释放,要在action操作之后,不然该缓存是无效的。

缓存级别:

级别使用空间CPU时间是否在内存中是否在磁盘上备注
MEMORY_ONLY
MEMORY_ONLY_2数据存2份
MEMORY_ONLY_SER_2数据序列化,数据存2份
MEMORY_AND_DISK中等部分部分如果数据在内存中放不下,则溢写到磁盘
MEMORY_AND_DISK_2中等部分部分数据存2份
MEMORY_AND_DISK_SER部分部分
MEMORY_AND_DISK_SER_2部分部分数据存2份
DISK_ONLY
DISK_ONLY_2数据存2份
NONE
OFF_HEAP

上面列表上的所有级别都是在org.apache.spark.storage.StorageLevel类中

如何选择存储级别

Spark 的存储级别的选择,核心问题是在内存使用率和 CPU 效率之间进行权衡。建议按下面的过程进行存储级别的选择 :

  • 如果使用 MEMORY_ONLY 存储在内存中的 RDD / DataFrame 没有发生溢出,那么就选择默认的存储级别。默认存储级别可以最大程度的提高 CPU 的效率,可以使在 RDD / DataFrame 上的操作以最快的速度运行。

  • 如果内存不能全部存储 RDD / DataFrame ,那么使用 MEMORY_ONLY_SER,并挑选一个快速序列化库将对象序列化,以节省内存空间。使用这种存储级别,计算速度仍然很快。

  • 除了在计算该数据集的代价特别高,或者在需要过滤大量数据的情况下,尽量不要将溢出的数据存储到磁盘。因为,重新计算这个数据分区的耗时与从磁盘读取这些数据的耗时差不多。

  • 如果想快速还原故障,建议使用多副本存储级别 MEMORY_ONLY_2 / MEMORY_ONLY_SER_2 。所有的存储级别都通过重新计算丢失的数据的方式,提供了完全容错机制。但是多副本级别在发生数据丢失时,不需要重新计算对应的数据库,可以让任务继续运行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值