spark的持久化和checkpoint的区别

RDD 可以使用 persist() 方法或 cache() 方法进行持久化
cache 底层调用的是 persist 方法,存储等级为: memory only,persist 的默认存储级别也是 memory only,persist 与 cache 的主要区别是 persist 可以自定义存储级别。哪些 RDD 需要 cache ? 会被重复使用的(但是)不能太大的RDD需要cache,cache 只使用 memory。

cache
cache就是讲共用的或者重复使用的RDD按照持久化的级别进行缓存。

checkpoint
checkpoint 就是将业务非常长的逻辑计算的中间结果缓存到HDFS上,其实现原理是:首先找到stage最后的finalRDD,然后按照RDD的依赖关系往回找,找到使用checkpoint的RDD;然后标记这个checkpoint的RDD;再重新启动一个线程将checkpoint之前的RDD缓存到HDFS上面;最后RDD的依赖关系从checkpoint的位置切断

cache 和 checkpoint 之间有一个重大的区别,cache 将 RDD 以及 RDD 的血统(记录了这个RDD如何产生)缓存到内存中,当缓存的 RDD 失效的时候(如内存损坏),它们可以通过血统重新计算来进行恢复。但是 checkpoint 将 RDD 缓存到了 HDFS 中,同时忽略了它的血统(也就是RDD之前的那些依赖)。为什么要丢掉依赖?因为可以利用 HDFS 多副本特性保证容错!
在进行checkpoint之前要设置 sc.setCheckpointDir("…")。除此之外,在进行 checkpoint 前,要先对 RDD 进行 cache。原因是:checkpoint 会等到 job 结束后另外启动专门的 job 去完成 checkpoint,也就是说需要 checkpoint 的 RDD 会被计算两次。

persist和 checkpoint 之间的区别:persist()可以将 RDD 的 partition 持久化到磁盘,但该 partition 由 blockManager 管理。一旦 driver program 执行结束,也就是 executor 所在进程 CoarseGrainedExecutorBackend stop,blockManager 也会 stop,被 cache 到磁盘上的 RDD 也会被清空(整个 blockManager 使用的 local 文件夹被删除)。而 checkpoint 将 RDD 持久化到 HDFS 或本地文件夹,如果不被手动 remove 掉,是一直存在的,也就是说可以被下一个 driver program 使用,而 cached RDD 不能被其他 dirver program 使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值