SparkCore:RDD容错机制Checkpoint

RDD容错机制Checkpoint

引入:

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

问题解决

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

使用步骤

  1. SparkContext.setCheckpointDir(“目录”) //HDFS的目录
  2. RDD.checkpoint()

代码演示

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

总结

  • 开发中如何保证数据的安全性性及读取效率
    可以对频繁使用且重要的数据,先做缓存/持久化,再做checkpint操作
  • 持久化和Checkpoint的区别
  1. 位置
    Persist 和 Cache 只能保存在本地的磁盘和内存中(或者堆外内存–实验中)
    Checkpoint 可以保存数据到 HDFS 这类可靠的存储上

  1. 生命周期
    Cache和Persist的RDD会在程序结束后会被清除或者手动调用unpersist方法
    Checkpoint的RDD在程序结束后依然存在,不会被删除

  1. Lineage(血统、依赖链–其实就是依赖关系)
    Persist和Cache,不会丢掉RDD间的依赖链/依赖关系,因为这种缓存是不可靠的,如果出现了一些错误(例如 Executor 宕机),需要通过回溯依赖链重新计算出来
    Checkpoint会斩断依赖链,因为Checkpoint会把结果保存在HDFS这类存储中,更加的安全可靠,一般不需要回溯依赖链
    在这里插入图片描述
    补充:Lineage
    RDD的Lineage(血统、依赖链)会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。
    在进行故障恢复时,Spark会对读取Checkpoint的开销和重新计算RDD分区的开销进行比较,从而自动选择最优的恢复策略。
发布了218 篇原创文章 · 获赞 330 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/weixin_43563705/article/details/105698950