Spark中RDD的持久化/缓存

Spark的高效性能得益于RDD的缓存和持久化,它可以避免重复计算并加速迭代算法。RDD默认惰性求值,缓存通过persist()实现,数据存储在内存或磁盘,序列化为默认选项。内存缓存可选级别包括默认的堆内存和memory_and_disk,unpersist()用于移除缓存。频繁使用的RDD适合缓存。
摘要由CSDN通过智能技术生成

Spark RDD的缓存

  • Spark速度非常快的原因之一,就是在不同操作中可以在内存中持久化或者缓存数据集。当持久化某个RDD后,每一个节点都将把计算分区结果保存在内存中,对此RDD或衍生出的RDD进行的其他动作中重用。这使得后续的动作变得更加迅速。RDD相关的持久化和缓存,是Spark最重要的特征之一。可以说,缓存是Spark构建迭代式算法和快速交互式查询的关键。
  • Spark RDD 是惰性求值的,而有时我们希望能多次使用同一个RDD。如果简单地对RDD 调用行动操作,Spark 每次都会重算RDD 以及它的所有依赖。这在迭代算法中消耗格外大,因为迭代算法常常会多次使用同一组数据。
    var input = sc.parallelize(List(1, 2, 3, 4, 5, 6, 7))
    val result = input.map(x => x*x)
    println(result.count())//7
    println(result.collect().mkString(","))//1,4,9,16,25,36,49

 

  • 为了避免多次计算同一个RDD,可以让Spark 对数据进行持久化。当我们让Spark 持久化存储一个RDD 时,计算出RDD 的节点会分别保存它们所求出的分区数据。如果一个有持久化数据的节点发生故障,Spark 会在需要用到缓存的数据时重算丢失的数据分区。如果希望节点故障的情况不会拖累我们的执行速度,也可以把数据备份到多个节点上。
  • 出于不同的目的,我们可以为RDD 选择不同的持久化级别。在Scala,默认情况下persist() 会把数据以序列化的形式缓存在JVM 的堆空间中。在Python 中,我们会始终序列化要持久化存储的数据,所以持久化级别默认值就是以序列化后的对象存储在JVM 堆空间中。当我们把数据写到磁盘或者堆外存储上时,也总是使用序列化后的数据。

  RDD缓存方式

 

缓存级别

userDisk

是否使用磁盘

useMemory

是否使用内存

useOffHeap

是否使用堆外内存

deserialized

是否反序列化

replication

副本数

NONE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值