SparkCore>RDD容错机制Checkpoint

文章目录

    • 引入
    • 代码演示
    • 查看结果:
    • 总结

引入

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

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

  • 使用步骤
    1.SparkContext.setCheckpointDir(“目录”) //HDFS的目录
    2.RDD.checkpoint()

代码演示

sc.setCheckpointDir("hdfs://node01:8020/ckpdir") 
//设置检查点目录,会立即在HDFS上创建一个空目录
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 /
或者通过web界面查看
http://192.168.1.101:50070

总结

●开发中如何保证数据的安全性性及读取效率
可以对频繁使用且重要的数据,先做缓存/持久化,再做checkpint操作

持久化和Checkpoint的区别

  • 1.位置
    Persist 和 Cache 只能保存在本地的磁盘和内存中(或者堆外内存–实验中)
    Checkpoint 可以保存数据到 HDFS 这类可靠的存储上

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

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

你可能感兴趣的:(SparkCore)