Spark中cache、persist、checkpoint区别
创始人
2025-06-01 20:26:04
0

spark中的cache、persist、checkpoint都可以将RDD保存起来,进行持久化操作,供后面重用或者容错处理。但是三者有所不同。

cache

  • 将数据临时存储在内存中进行数据重用,不够安全;
  • 会在血缘关系中添加新的依赖,如果出现问题,可以重新从头读取数据。

persist

  • 将数据临时存储在磁盘文件中进行数据重用;
  • 涉及到磁盘IO,性能较低,但是数据安全;
  • 如果作业执行完毕,临时保存的数据文件就会丢失。

checkpoint

  • 将数据长久的保存在磁盘文件中进行数据重用;
  • 涉及到磁盘IO,性能较低,但是数据安全;
  • 为了保证数据安全,所以一般情况下,会独立执行作业;
  • 为了能够提高效率,一般情况下,需要和cache联合使用。RDD.cache() RDD.checkpoint()
  • 需要指定保存路径,一般为HDFS;
  • 执行过程中,会切断血缘关系,重新建立新的血缘关系。checkpoint等同于改变数据源。

血缘关系改变代码测试

  1. cache
package com.zsz.spark.core.rdd.operator.persistimport org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object Spark_RDD_Persist {def main(args: Array[String]): Unit = {val conf: SparkConf = new SparkConf().setMaster("local").setAppName("persist")val sc = new SparkContext(conf)val rdd: RDD[String] = sc.makeRDD(List("hello spark", "hello scala"))val flatMapRDD: RDD[String] = rdd.flatMap(_.split(" "))val mapRDD: RDD[(String, Int)] = flatMapRDD.map((_, 1))val reduceRDD: RDD[(String, Int)] = mapRDD.reduceByKey(_ + _)mapRDD.cache()// 打印血缘关系println(mapRDD.toDebugString)reduceRDD.collect().foreach(println)println("*****************************")// 打印血缘关系println(mapRDD.toDebugString)sc.stop()}
}

输出结果:
cache输出结果
从结果可以看到,cache和persist方式会在血缘关系中添加新的依赖。

  1. checkpoint
package com.zsz.spark.core.rdd.operator.persistimport org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object Spark_RDD_Persist {def main(args: Array[String]): Unit = {val conf: SparkConf = new SparkConf().setMaster("local").setAppName("persist")val sc = new SparkContext(conf)sc.setCheckpointDir("cp")val rdd: RDD[String] = sc.makeRDD(List("hello spark", "hello scala"))val flatMapRDD: RDD[String] = rdd.flatMap(_.split(" "))val mapRDD: RDD[(String, Int)] = flatMapRDD.map((_, 1))val reduceRDD: RDD[(String, Int)] = mapRDD.reduceByKey(_ + _)// mapRDD.cache()mapRDD.checkpoint()// 打印血缘关系println(mapRDD.toDebugString)reduceRDD.collect().foreach(println)println("*****************************")// 打印血缘关系println(mapRDD.toDebugString)sc.stop()}
}

输出结果:
checkpoint
从结果看出,checkpoint会切断血缘关系,重新建立新的血缘关系。等同于改变数据源。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...