Spark的checkpoint
1. 为什么要使用checkpoint
当一个计算有上百个甚至更多个rdd的时候,如果前20个rdd的计算结果重复被使用,这个时候我们就可以使用checkpoint将前20个rdd的计算结果缓存到本地。大大提高运算效率,
当RDD使用cache机制从内存中读取数据,如果数据没有读到,会使用checkpoint机制读取数据。此时如果没有checkpoint机制,那么就需要找到父RDD重新计算数据了,因此checkpoint是个很重要的容错机制。checkpoint就是对于一个RDD chain,如果中间某些中间结果RDD,后面需要反复使用该数据,可能因为一些故障导致该中间数据丢失,那么就可以针对该RDD启动checkpoint机制
2. 使用checkpoint
- 首先需要调用sparkContext的setCheckpointDir(“path”),设置checkpoint保存的路径,比如hdfs路径
- 对RDD调用checkpoint方法
- 当rdd调用action的时候,启动一个job计算rdd,当此RDD所处的job运行结束后,会启动一个单独的job,来将checkpoint过的数据写入之前设置的文件系统持久化,进行高可用。所以后面的计算在使用该RDD时,如果数据丢失了,但是还是可以从它的checkpoint中读取数据,不需要重新计算。
源码中RDD里的checkpoint()方法的注释
/**
* Mark this RDD for checkpointing. It will be saved to a file inside the checkpoint
* directory set with `SparkContext#setCheckpointDir` and all references to its parent
* RDDs will be removed. This function must be called before any job has been
* executed on this RDD. It is strongly recommended that this RDD is persisted in
* memory, otherwise saving it on a file will require recomputation.
*/
里面建议在执行checkpoint()方法之前先对rdd进行persisted操作,当在rdd执行action的时候,启动一个job执行rdd的计算,当计算执行到rdd设置checkpoint的点,此时就会将计算的结果从内存中写入之前设置的文件系统持久化,进行高可用。这样做的好处是,不会启动一个新的job进行计算,checkpoint到本地。
val data = sc.textFile("/spark/text.data").cache() // 注意要cache
sc.setCheckpointDir("/spark/checkpoint") //设置checkpoint目录
data.checkpoint //对rddcheckpoin
data.count //rdd执行aciton
3. checkpoint与cache的区别
会被重复使用的(但是)不能太大的RDD需要cache。cache 只使用 memorycache持久化只是将数据保存在BlockManager中但是其lineage是不变的
checkpoint执行完后,rdd已经没有依赖RDD,只有一个checkpointRDD,checkpoint之后,
RDD的lineage就改变了。而且,持久化的数据丢失的可能性更大,因为可能磁盘或内存被清理,但是checkpoint的数据通常保存到hdfs上,放在了高容错文件系统。