Spark -- RDD缓存和CheckPoint

Spark – RDD缓存和CheckPoint

1. 缓存

RDD通过persist方法或cache方法可以将前面的计算结果缓存,默认情况下 persist() 会把数据以序列化的形式缓存在 JVM 的堆空间中。 但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD将会被缓存在计算节点的内存中,并供后面重用。cache最终也是调用了persist方法,默认的存储级别都是仅在内存存储一份,Spark的存储级别还有好多种,存储级别在object StorageLevel中定义的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F6frbyAO-1587394479657)(C:\Users\11295\AppData\Local\Temp\1587392600732.png)]

在存储级别的末尾加上“_2”来把持久化数据存为两份

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cePC0Izx-1587394479663)(file:///C:\Users\11295\AppData\Local\Temp\ksohtml6372\wps10.jpg)]

缓存有可能丢失,或者存储存储于内存的数据由于内存不足而被删除,RDD的缓存容错机制保证了即使缓存丢失也能保证计算的正确执行。通过基于RDD的一系列转换,丢失的数据会被重算,由于RDD的各个Partition是相对独立的,因此只需要计算丢失的部分即可,并不需要重算全部Partition

def main(args: Array[String]): Unit = {
    //1.初始化配置信息及SparkContext
    val sparkConf: SparkConf = new SparkConf().setAppName("WordCount").setMaster("local[*]")
    val sc = new SparkContext(sparkConf)
    
    val rdd = sc.makeRDD(Array("cache"))
    val rdd2 = rdd.map(_.toString+System.currentTimeMillis())
    rdd2.collect().foreach(println)
    rdd2.collect().foreach(println)
    rdd2.collect().foreach(println)
    rdd2.collect().foreach(println)
	
    //进行缓存,
    val rdd3 = rdd.map(_.toString+System.currentTimeMillis()).cache()
    rdd3.collect().foreach(println)
    rdd3.collect().foreach(println)
    rdd3.collect().foreach(println)
    rdd3.collect().foreach(println)
    rdd3.collect().foreach(println)
    sc.stop()
}


打印结果:
cache1587392149752
cache1587392150101
cache1587392150167
cache1587392150233

cache1587392150307
cache1587392150307
cache1587392150307
cache1587392150307
cache1587392150307

2.Checkpoint

Spark中对于数据的保存除了持久化操作之外,还提供了一种检查点的机制,检查点(本质是通过将RDD写入Disk做检查点)是为了通过lineage做容错的辅助,lineage过长会造成容错成本过高,这样就不如在中间阶段做检查点容错,如果之后有节点出现问题而丢失分区,从做检查点的RDD开始重做Lineage,就会减少开销。检查点通过将数据写入到HDFS文件系统实现了RDD的检查点功能。

为当前RDD设置检查点。该函数将会创建一个二进制的文件,并存储到checkpoint目录中,该目录是用SparkContext.setCheckpointDir()设置的。在checkpoint的过程中,该RDD的所有依赖于父RDD中的信息将全部被移除。对RDD进行checkpoint操作并不会马上被执行,必须执行Action操作才能触发。

object RDDcache {
  def main(args: Array[String]): Unit = {
    //1.初始化配置信息及SparkContext
    val sparkConf: SparkConf = new SparkConf().setAppName("WordCount").setMaster("local[*]")
    val sc = new SparkContext(sparkConf)


    //设定检查点的报存目录
    sc.setCheckpointDir("F:\\032_Spark\\1.笔记")
    //2.创建一个RDD
    val rdd: RDD[Int] = sc.makeRDD(List(1,2,1,2,3))
    val mapRDD: RDD[(Int, Int)] = rdd.map((_,1))

    //checkPoint
    mapRDD.checkpoint()

    val reduceRDD: RDD[(Int, Int)] = mapRDD.reduceByKey(_+_)

    reduceRDD.foreach(println)
    println(reduceRDD.toDebugString)
    sc.stop()
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值