spark学习进度12(RDD的Checkpoint)

1. Checkpoint

目标
  1. Checkpoint 的作用

  2. Checkpoint 的使用

  3.  

     

1.1. Checkpoint 的作用

Checkpoint 的主要作用是斩断 RDD 的依赖链, 并且将数据存储在可靠的存储引擎中, 例如支持分布式存储和副本机制的 HDFS.

Checkpoint 的方式
  • 可靠的 将数据存储在可靠的存储引擎中, 例如 HDFS

  • 本地的 将数据存储在本地

什么是斩断依赖链

斩断依赖链是一个非常重要的操作, 接下来以 HDFS 的 NameNode 的原理来举例说明

HDFS 的 NameNode 中主要职责就是维护两个文件, 一个叫做 edits, 另外一个叫做 fsimageedits 中主要存放 EditLogFsImage 保存了当前系统中所有目录和文件的信息. 这个 FsImage 其实就是一个 Checkpoint.

HDFS 的 NameNode 维护这两个文件的主要过程是, 首先, 会由 fsimage 文件记录当前系统某个时间点的完整数据, 自此之后的数据并不是时刻写入 fsimage, 而是将操作记录存储在 edits 文件中. 其次, 在一定的触发条件下, edits 会将自身合并进入 fsimage. 最后生成新的 fsimage 文件, edits 重置, 从新记录这次 fsimage 以后的操作日志.

如果不合并 edits 进入 fsimage 会怎样? 会导致 edits 中记录的日志过长, 容易出错.

所以当 Spark 的一个 Job 执行流程过长的时候, 也需要这样的一个斩断依赖链的过程, 使得接下来的计算轻装上阵.

Checkpoint 和 Cache 的区别

Cache 可以把 RDD 计算出来然后放在内存中, 但是 RDD 的依赖链(相当于 NameNode 中的 Edits 日志)是不能丢掉的, 因为这种缓存是不可靠的, 如果出现了一些错误(例如 Executor 宕机), 这个 RDD 的容错就只能通过回溯依赖链, 重放计算出来.

但是 Checkpoint 把结果保存在 HDFS 这类存储中, 就是可靠的了, 所以可以斩断依赖, 如果出错了, 则通过复制 HDFS 中的文件来实现容错.

所以他们的区别主要在以下两点

  • Checkpoint 可以保存数据到 HDFS 这类可靠的存储上, Persist 和 Cache 只能保存在本地的磁盘和内存中

  • Checkpoint 可以斩断 RDD 的依赖链, 而 Persist 和 Cache 不行

  • 因为 CheckpointRDD 没有向上的依赖链, 所以程序结束后依然存在, 不会被删除. 而 Cache 和 Persist 会在程序结束后立刻被清除.

1.2. 使用 Checkpoint

 

 

 

 

 

 @Test
  def checkpoint(): Unit = {
    val conf = new SparkConf().setMaster("local[6]").setAppName("debug_string")
    val sc = new SparkContext(conf)
    sc.setCheckpointDir("checkpoint")//这里设置

    var interimRDD = sc.textFile("dataset/access_log_sample.txt")
      .map(item => (item.split(" ")(0), 1))
      .filter(item => StringUtils.isNotBlank(item._1))
      .reduceByKey((curr, agg) => curr + agg)
    //下面打搭配才是最好的
    interimRDD=interimRDD.cache()
    interimRDD.checkpoint()//这里(不准确的说他是一个action)
    interimRDD.collect().foreach(println(_))
    sc.stop()
  }

 


 

 

posted @ 2021-01-11 12:42  喜欢爬的孩子  阅读(110)  评论(0编辑  收藏  举报