CheckPoint 是什么
⚪️ CheckPoint 产生背景:
CheckPoint 是用来保证数据的容错和高可用而产生的,在一个复杂的 Spark 作业中,从初始的 RDD 到最后的结果,中间有大量的操作,整个程序运行时间较长,而如果此时某个节点故障,或者其他原因导致数据丢失,那么此时,后续的计算就无法继续,我们知道通常一个 RDD 是由上一个 RDD 计算的来,如果经常要复用某个 RDD,此时 RDD 数据丢失,只能根据数据来源重新计算,前面说过如果这过程复杂而耗时,那么将会浪费大量的时间来处理这种故障,这显然是不应该的,但是这种故障对于高负载的集群来说可能是经常性发生的问题。那么如何解决这种问题呢,答案就是 CheckPoint
机制。
⚪️ CheckPoint 工作流程:
CheckPoint 作为解决数据丢失的容错机制,需要我们对于需要针对特殊的 RDD 数据开启这种功能,因为安全的保证必然带来部分性能的丢失,所以有必要有针对性的对于需要的 RDD 开启这种机制(调用 SparkContext 的 setCheckPointDir()方法设置容错目录,一般是 HDFS,HDFS 背身就是高可用的文件系统,会创建多个数据副本),当我们设置完之后,对 RDD 调用 CheckPoint()方法,此时这个 RDD 已经成为被重点保护的对象,当 RDD 的 Job 完成之后会启用一个 job 来对此 RDD 保存到刚才设置的文件系统中,这样就能保证当数据丢失的时候可以从此文件得到 RDD,不影响后续的操作。从而达到提升性能的目的。
CheckPoint 和持久化的区别
Cache/Persit 持久化:
- 持久化只是将数据存储到 BlockManager 中,但是 lineage 血缘,依赖关系不变。
- 数据存储在 DISK/Memory 中更容易丢失。存储介质本身不具备高可用容错。
CheckPoint 机制:
- checkPoint 执行完毕后,RDD 已经没有所以依赖的 RDD 了,会被设置成一个 CheckPointRDD,他的 lineage 血缘关系已经改变了。
- 数据存储在 HDFS 这种高可用的文件系统中,多节点备份存储,更安全可靠,数据丢失的可能性更底。
需要注意的是:如果我们没有对 RDD 进行持久化缓存,但是却对它进行了 CheckPoint,那么在这个 Job 完成之后,
需要CheckPoint的时候在磁盘查找不到这个RDD,需要再一次对这个RDD更新计算一次
。所以说,CheckPoint 是容错的高级保障,而 Cache/persit 则是基础保证,因为在 CacheManager 介绍的过程中我们直到服用一个 RDD 首先是到 Cache 中查找的,checkpoints 是最后一步。毕竟到 HDFS 中查找消耗 I/O。所以,Checkpoint 最好先 Persit,并且设置缓存级别为DISK_ONLY
.在 Checkpoint 的时候会直接去磁盘读取数据到文件系统,不需要重新计算,有效的提升效率。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于