spark中的checkpoint,持久化和checkpoint的区别

spark中的checkpoint

​ 持久化/缓存可以把数据放在内存中,虽然是快速的,但是也是最不可靠的;也可以把数据放在磁盘上,也不是完全可靠的!例如磁盘会损坏等。

​ Checkpoint的产生就是为了更加可靠的数据持久化,在Checkpoint的时候一般把数据放在在HDFS上,这就天然的借助了HDFS天生的高容错、高可靠来实现数据最大程度上的安全,实现了RDD的容错和高可用。
在这里插入图片描述

具体用法

sc.setCheckpointDir("hdfs://master:8020/ckpdir") 
//设置检查点目录,会立即在HDFS上创建一个空目录
val rdd1 = sc.textFile("hdfs://master:8020/wordcount/input/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
rdd1.checkpoint //对rdd1进行检查点保存
rdd1.collect //Action操作才会真正执行checkpoint
//后续如果要使用到rdd1可以从checkpoint中读取
持久化和Checkpoint的区别

1.位置

Persist 和 Cache 只能保存在本地的磁盘和内存中(或者堆外内存–实验中)

Checkpoint 可以保存数据到 HDFS 这类可靠的存储上

2.生命周期

Cache和Persist的RDD会在程序结束后会被清除或者手动调用unpersist方法

Checkpoint的RDD在程序结束后依然存在,不会被删除

3.Lineage(血统、依赖链–其实就是依赖关系)

Persist和Cache,不会丢掉RDD间的依赖链/依赖关系,因为这种缓存是不可靠的,如果出现了一些错误(例如 Executor 宕机),需要通过回溯依赖链重新计算出来

Checkpoint会斩断依赖链,因为Checkpoint会把结果保存在HDFS这类存储中,更加的安全可靠,一般不需要回溯依赖链

idea中运行示例:

import org.apache.spark.rdd.RDD
import org.apache.spark.storage.StorageLevel
import org.apache.spark.{SparkConf, SparkContext}

object DemoCheckPoint {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf()
      .setMaster("local")
      .setAppName("DemoCheckPoint")

    val sc: SparkContext = new SparkContext(conf)

    // 设置CheckPoint 存储的位置
    sc.setCheckpointDir("spark/data/checkpoint")

    // 读取学生数据构建RDD
    val stuRDD: RDD[String] = sc.textFile("spark/data/student.txt")

    val mapStuRDD: RDD[String] = stuRDD.map(line => {
      println("=====stu=====")
      line
    })
    // 对使用了多次的RDD进行缓存
    // cache() 默认将数据缓存到内存当中
    //    mapStuRDD.cache()

    // 如果想要选择其他的缓存策略 可以通过persist方法手动传入一个StorageLevel
    //    mapStuRDD.persist(StorageLevel.MEMORY_AND_DISK_SER)

    // 因为checkpoint需要重新启动一个任务进行计算并写入HDFS
    // 可以在checkpoint之前 先做一次cache 可以省略计算过程 直接写入HDFS
    mapStuRDD.cache()
    // 将数据缓存到 HDFS
    // checkpoint主要运用在SparkStreaming中的容错
    mapStuRDD.checkpoint()
    // 统计班级人数
    val clazzRDD: RDD[(String, Int)] = mapStuRDD.map(line => (line.split(",")(4), 1))
    val clazzCntRDD: RDD[(String, Int)] = clazzRDD.reduceByKey(_ + _)
    clazzCntRDD.foreach(println)

    // 统计性别人数
    val genderRDD: RDD[(String, Int)] = mapStuRDD.map(line => (line.split(",")(3), 1))
    val genderCntRDD: RDD[(String, Int)] = genderRDD.reduceByKey(_ + _)
    genderCntRDD.foreach(println)

    // 用完记得释放缓存
    //    mapStuRDD.unpersist()

  }

}

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sparkcheckpoint是一种机制,用于在Spark应用程序持久化RDD或DataFrame的间结果。它可以在应用程序执行过程将数据写入持久化存储,以便在应用程序失败或重新启动时恢复数据。 checkpoint的主要作用是避免在应用程序断或失败后重新计算整个RDD或DataFrame的代价。通过将间结果写入持久化存储,可以避免重复计算,并提高应用程序的容错性。 使用checkpoint的步骤如下: 1. 设置checkpoint目录:在Spark应用程序,首先需要设置一个目录来存储checkpoint数据。可以通过调用`SparkContext.setCheckpointDir(dir: String)`方法来设置。 2. 对RDD或DataFrame进行checkpoint:在需要进行checkpointRDD或DataFrame上调用`rdd.checkpoint()`或`df.checkpoint()`方法。这将触发对数据的计算,并将计算结果写入checkpoint目录。 3. 执行应用程序:在应用程序执行相应的转换和操作。 4. 恢复checkpoint数据:如果应用程序失败或重新启动,可以使用`SparkContext.getCheckpointDir()`方法获取checkpoint目录,并通过调用`sc.textFile(checkpointPath)`或`spark.read.load(checkpointPath)`等方法加载checkpoint数据。 需要注意的是,checkpoint会增加应用程序的执行时间和存储开销。因此,只有在需要容错性和避免重复计算的情况下才建议使用checkpoint。 另外,Spark还提供了自动触发checkpoint的机制,可以通过设置`sparkContext.setCheckpointInterval(interval: Duration)`来定期触发checkpoint操作,以避免数据计算过程的内存溢出或长时间计算造成的问题。 总之,checkpointSpark一种重要的机制,用于持久化间结果,提高应用程序的容错性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值