一、RDD 的持久化原理(cache&persist):
首先明确一点,RDD 中是不存储数据的,如果一个 RDD 需要重复使用,那么需要从头执行来获取数据。所以,RDD 的持久化就是为了解决这一问题:
如果需要重用 RDD 的话,可以使用 cache 或者 persist 方法来实现数据持久化,将数据缓存到内存或者磁盘文件中,那么下一次操作直接可以获取数据,不需要从头执行。
cache()和 persist()的区别在于,cache()是 persist()的一种简化方式,cache()底层就是调用的 persist()无参版本 persist(MEMORY_ONLY),将数据持久化到内存中。如果需要从内存中清除缓存,可以使用 unpersist()方法。RDD 持久化是可以手动选择不同的策略的,在调用 persist()时传入对应的可选参数即可。
缓存到内存的话效率快,但不安全;磁盘文件安全但效率低,所以要综合考虑选择。
要注意一点,这两个方法并不是被调用时立即缓存,而是触发后面的 action 算子时,该 RDD 才会被缓存在计算结点的内存中,供后面重用。
二、Checkpoint 和持久化机制的区别
1. 最主要的区别在于,持久化只是将数据保存在内存或磁盘文件中,RDD 的依赖关系没有改变。而 checkpoint 执行完之后,RDD 的依赖关系已经改变了,没有之前的依赖关系了,只有一个 checkpointRDD,checkpoint 之后 RDD 的依赖关系就变了。
2. 持久化的数据丢失的可能性较大,因为结点的故障会导致磁盘、内存的数据丢失,但 checkpoint 的数据通常是保存在高可用的文件系统中,如 HDFS,所以数据丢失的可能性较低。
三、cache、persist、checkpoint 之间的区别:
补充:checkpoint 会单独执行一个作业(也就是执行两遍),来保证高可用。为了提高效率,可以联合 cache 使用,先 cache,在 checkpoint。checkpoint 会切断血缘关系,重新建立血缘关系,后面直接从 checkpoint 数据源这里拿数据,等同于改变了数据源。
四、checkpoint 检查点机制:
所谓的检查点其实就是将 RDD 中间结果写入磁盘。由于血缘依赖过长会造成容错成本过高,这样就不如在中间阶段做检查点容错,如果检查点之后有节点出现问题,可以从检查点开始重做血缘,减少开销。
1.checkpoint 检查点引入的原因:对于一些特别复杂的 Spark 应用,会出现某个反复使用的 RDD,即使之前持久化过,但可能会因为节点的故障导致数据丢失了,没有容错机制,所以需要重新计算一次数据,导致效率低下。而 checkpoint 的数据通常是保存在高可用的文件系统中,如 HDFS,所以数据丢失的可能性较低。
2. 原理:(1)Checkpoint 首先会调用 SparkContext 的 setCheckPointDIR () 方法,设置一个容错的文件系统的目录,比如说 HDFS;(2)然后对 RDD 调用 checkpoint () 方法。(3)之后在 RDD 所处的 job 运行结束之后,会启动一个单独的 job,来将 checkpoint 过的 RDD 数据写入之前设置的文件系统,进行高可用、容错的类持久化操作。
3.应用场景:除了为了重复使用数据,这两个场合也可以使用 checkpoint 检查点:(1)当 spark 应用程序特别复杂,从初始的 RDD 开始到最后,整个应用程序的完成有很多的步骤,数据执行较长;(2)或数据比较重要的场合,都是可以使用 checkpoint 功能。
4. 作用:检查点机制是我们在 spark streaming 中用来保障容错性的主要机制,它可以使spark streaming 阶段性的把应用数据存储到诸如 HDFS 等可靠存储系统中,以供恢复时使用。具体来说基于以下两个目的服务:
(1)控制发生失败时需要重算的状态数。Spark streaming 可以通过转化图的谱系图来重算状态,检查点机制则可以控制需要在转化图中回溯多远。
(2) 提供驱动器程序容错。如果流计算应用中的驱动器程序崩溃了,你可以重启驱动器程序并让驱动器程序从检查点恢复,这样 spark streaming 就可以读取之前运行的程序处理数据的进度,并从那里继续。