Spark-RDD-04 checkpoint容错机制

我们了解到合理地将RDD持久化/缓存,不仅直接避免了RDD的重复计算导致的资原浪费和占用,还提升了RDD的容错性,

而且间接提升了分析任务的完成效率,那么为什么又会需要基于checkpoint的容错机制,在什么情况下需要设置checkpoint呢?

对RDD进行ceckpoin操作,会将RDD直接存储到磁盘上,而不是内存,从而实现真正的数据持久化。

checkpoint实际上对RDD lineage (RDD依赖关系图谱)的辅助和重新切割修正,当RDD依赖关系过于冗长和复杂时,

即依赖关系已达数十代,多个不同的分析任务同时依赖该RDD lineage多个中间RDD时,并且内存难以同时满足缓存多个相关

中间RDD时,可以考虑根据多个不同分析任务依赖的中间RDD的不同,使用checkpoint将该RDD lineage 切分成多个

子RDD lineage,这样每一个子RDD lineage都会从各自checkpoint开始算起,从而实现了相互独立,大大减少了由于过于冗长

的RDD lineage造成的高昂容错成本以及内存资源不足问题。

RDD设置检查点(checkpoint),checkpoint 函数将会创建一个 二进制的文件,并存储到checkpoint目录中(checkpoint 保存的

目录是在HDFS目录中,天然地保证了存储的可靠性),该目录是用SparkContext.setCheckpoinDir()设置的。在checkpoint的

过程中,该RDD的所有依赖于父RDD中的信息将全部被移出。对RDD进行checkpoint操作并不会马上核执行,必须执行Action

操作才能触发。

源码剖析:

(1)当使用了checkpoint后,数据被保存到HDFS,此RDD的依赖关系也会天掉,因为数据已经持久化到硬盘,不需要重新计算,会丢弃掉。

(2)强烈推荐先将数据持久化到内存中(cache 操作),否则直接使用checkpoint 会开启一个计算,浪费资源。为哈要这样呢?因为checkpoint会触发个Job,如果执行checkpoint的rdd是由其他rdd经过许多计算转换过来的,如果你没有持久化这个rdd,那么又要从头开始计算该rdd,也就是做了重复的计算工作了,所以建议先persist rdd然后再checkpoint.

(3)对涉及大量达代计算的重要阶段性结果设置检查点。checkpoint 会丢弃该rdd的以前的依赖关系,使该rdd成为顶层父rdd,这样在失败的时候恢复只需要恢复该rdd,而不需要重新计算该rdd了,这在达代计算中是很有用的,假设你在达代1000次的计算中在第999次失败了,然后你没有checkpoint,你只能重新开始恢复了,如果恰好你在第998次选代的时候做了一个checkpoint,那么你只需要恢复第998次产生的rld,然后再执行2次迭化完成总共1000的迭代,这样效率就很高,比较适用于选代计算非常复杂的情况。也就是说在恢复计算代价非常高的情况下,适当进行checkpoint会有很大的好处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值