spark -- RDD容错机制Checkpoint

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/dfshealth.html#tab-overview

总结

●开发中如何保证数据的安全性性及读取效率

可以对频繁使用且重要的数据,先做缓存/持久化,再做checkpint操作

持久化和Checkpoint的区别

1.位置

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

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

2.生命周期

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

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

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

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

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

补充:Lineage

RDD的Lineage(血统、依赖链)会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区

在进行故障恢复时,Spark会对读取Checkpoint的开销和重新计算RDD分区的开销进行比较,从而自动选择最优的恢复策略。

发布了107 篇原创文章 · 获赞 195 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/weixin_44036154/article/details/105385660