Spark中RDD容错机制Checkpoint

一:引入

持久化的局限

Spark 在生产环境下经常会面临transformation的RDD非常多或者具体transformation的RDD本身计算特别复杂或者耗时,这个时候就要考虑对计算结果数据的持久化:

如果把数据放在内存中,虽然是快速的,但是也是最不可靠的;

如果把数据放在磁盘上,也不是完全可靠的!例如磁盘会损坏等。

●问题解决

Checkpoint的产生就是为了相对而言更加可靠的持久化数据

在Checkpoint的时候可以指定把数据放在本地,也可以是在HDFS上,这就天然的借助了HDFS高容错、高可靠的特征来实现了更加可靠的数据持久化、保证数据最大程度的安全,也更进一步的实现了RDD的容错和高可用

​​​​​​​​​​​​​​二:  使用步骤

1.调用SparkContext.setCheckpointDir("目录")方法,设置一个容错文件系统目录,比如hdfs,

2.对需要进行Checkpoint的RDD调用RDD.checkpoint方法。

RDD所在job运行结束后Spark会自动启动一个单独的job,将数据写入之前设置的文件系统持久化,进行高可用。

​​​​​​​​​​​​​​三:  操作演示

sc.setCheckpointDir("hdfs://node-01:9000/ckpdir") //设置检查点目录,会立即在HDFS上创建一个空目录

val rdd1 = sc.textFile("hdfs://node-01:9000/wordcount/input/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)

rdd1.checkpoint //对rdd1进行检查点保存

rdd1.collect //Action会真正执行checkpoint

四:总结

开发中如何保证数据的安全性性及读取效率

可以对频繁使用且重要的数据,先做持久化,再做checkpint操作

●注意

在执行数据缓存的时候,需要有对应的action算子操作,才会真正触发持久化操作。

在做checkpoint操作的时候,此时会先执行对应触发action算子的rdd结果,计算完成之后Spark会再开辟一个新的job来存储checkpointRdd的结果。

持久化和Checkpoint的区别

1.位置

Persist 和 Cache 只能保存在本地的磁盘和内存中(或者堆外内存--实验中)

Checkpoint 可以保存数据到 HDFS 这类可靠的存储上

2.Lineage(血统、依赖链--其实就是依赖关系)

Persist和Cache,不会丢掉RDD间的依赖链/依赖关系,因为这种缓存是不可靠的,如果出现了一些错误(例如 Executor 宕机),需要通过回溯依赖链,重放计算出来

Checkpoint会斩断依赖链,因为Checkpoint会把结果保存在HDFS这类存储中,更加的安全可靠,一般不需要回溯依赖链

3.生命周期

Cache和Persist的RDD会在程序结束后立刻被清除或者手动调用unpersist方法

CheckpointRDD在程序结束后依然存在,不会被删除.

猜你喜欢

转载自blog.csdn.net/qq_38483094/article/details/98629412