Spark 持久化机制和 Checkpoint 机制

Spark 中对 RDD 的转换操作只是生成一个新的 RDD,这个新的 RDD 里面存储了依赖关系,只有执行到动作才会将 RDD 进行计算生成一个结果,然后才会将 计算结果返回给 Driver。

可以看出每当我们对 RDD 调用一个新的 action 操作时,整个 RDD 都会从头开始计算。如果某个 RDD 会被重复使用的话,每次都从头计算会非常的低效。针对这种情况我们可以使用 RDD 的持久化机制或者 Checkpoint 机制。

持久化机制( persist() 和 cache() ) 是根据设置的缓存级别,可以将 RDD 的数据缓存到内存或者磁盘中去的,同时它的所有依赖关系也会被一并缓存下来。所以持久化的 RDD 有自动的容错机制。如果 RDD 的任一分区丢失了,通过使用原先创建它的转化操作,可以被自动重算。

Checkpoint 机制是将 RDD 的分区数据保存在磁盘或者 HDFS 中,而且依赖关系是丢掉的。

可以看出,持久化机制支持缓存在内存中,这样后续计算时数据读取速度比较高,效率会提升一些,但是由于支持缓存内存,后续如果某个节点的 Executor 挂了,那么缓存在内存的数据会丢失,所以要保存好 RDD 的依赖关系,这样就可以重新计算出该 RDD 挂掉的缓存分区数据。

但 Checkpoint 存储在磁盘或者 HDFS 上,数据不会丢失,故完全可以不用缓存依赖关系。不过由于 Checkpoint 是需要把 job 重新从头算一遍,最好还是先 cache 一下,这样 Checkpoint 就可以直接保存缓存在内存中的 RDD 了,不需要重头计算一遍,有足于性能的提升。

Checkpoint 的整体可靠性很高,可以支持被多个 driver 使用。比如,当 spark streaming 挂掉了,重启后就可以直接使用之前的 Checkpoint 的数据进行 recover。

参考:https://mp.weixin.qq.com/s/6251MJNvpp-Unfeo2BjwmQ?