Spark RDD持久化算子

先看这样一段代码:
在这里插入图片描述
在这段代码中,一个 action 算子代表一个 job ,每一个 count 都对 errors 进行了重复的使用,造成重复的读磁盘操作,降低了运行速度。
为了避免这种浪费,应该存在一种中间缓存技术—— RDD 持久化。

RDD 的持久化算子
cache
persist
checkpoint

cache

默认将数据存在内存中,懒执行算子

/*
从内存读数据与从磁盘读数据的区别
*/
package cn.itcast.demo
import org.apache.spark.{SparkConf, SparkContext}
class testdemo {
}
object testdemo {
  /*
   *持久化算子
  cache默认将数据存在内存中,懒执行算子
   */
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local").setAppName("cacheTest")
    val sc = new SparkContext(conf)
    val RDD = sc.textFile("datademo.txt")
    RDD.cache()
    val starttime = System.currentTimeMillis()
    val count1 = RDD.count()
    val endtime = System.currentTimeMillis()
    println("count1前后时间差为:" + (endtime - starttime))

    val starttime1 = System.currentTimeMillis()
    val count2 = RDD.count()
    val endtime1 = System.currentTimeMillis()
    println("count2前后时间差为:" + (endtime1 - starttime1))
    /*
    在这里,count1肯定是从磁盘读取数据,因为RDD不存数据
    RDD.cache()也并没有将数据放在内存中(懒执行)
    接下来count()也就不能从内存中读取数据,但作为action它会触发持久化算子
    也就是cache,于是再接下来的count2就能得到被cache保存在内存中的数据了
     */
    sc.stop()
  }
}

在这里插入图片描述

persist

可手动指定持久化级别
在这里插入图片描述
在这里插入图片描述
tip: memory_and_disk 内存不够了剩下的再放磁盘。
上图中的 true 和 false 代表以下参数:
private var _useDisk: Boolean, //使用磁盘吗
private var _useMemory: Boolean, //使用内存吗
private var _useOffHeap: Boolean, //使用堆外内存吗
private var _deserialized: Boolean, //不序列化
private var _replication: Int = 1) //默认副本

checkpoint

将数据存在磁盘中,对于某个计算逻辑十分复杂的 RDD ,对其做一个 checkpoint ,设置一个 checkpoint 目录,当该 job 执行完成后,回溯 DAG ,从头再开始执行一遍 job 直到 checkpoint 点,将该 RDD 执行后的结果存入磁盘,如果有 RDD 发生错误,checkpoint 点的 RDD 之后的 RDD 会根据自己前面的 RDD 是否设置 checkpoint 来决定是否从头回溯 DAG

小优化:checkpoint 之前 cache
这里值得注意的是:cache 机制是每计算出一个要 cache 的 partition 就直接将其 cache 到内存了。但 checkpoint 没有使用这种第一次计算得到就存储的方法,而是等到 job 结束后另外启动专门的 job 去完成 checkpoint 。也就是说需要 checkpoint 的 RDD 会被计算两次。因此,在使用 rdd.checkpoint() 的时候,建议加上 rdd.cache(),这样第二次运行的 job 就不用再去计算该 rdd 了,直接读取 cache 写磁盘。

注意这里和 persist(DISK_ONLY)的区别:

  • persist(DISK_ONLY) 没有切断 DAG 逻辑回溯的功能
  • checkpoint 在 Application 执行完后不会回收,下一个 Application 还可以继续用;当checkpoint点后的RDD丢了的时候,不用在该点继续往前回溯,直接使用已落地磁盘的数据就好

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值