RDD数据可以持久化缓存,比如 cache()、persist(),虽然快速但也是最不可靠的,比如内存损坏、磁盘损坏。
Checkpoint 的持久化是存储在HDFS上的,因为具备高可用,所以非常可靠,但会切断执行 checkpoint RDD的依赖关系。Checkpoint 常用于RDD数据备份,以便从HDFS中恢。
checkpoint 的使用步骤:
# 第一步:
sc.setCheckpointDir('hdfs:///ckp/8-checkpoint') # 指定HDFS的目录
# 第二步:
split_rdd.checkpoint() # 后续频繁使用到的RDD、或很重要的RDD
RDD Checkpoint 检查点机制案例
-
数据准备(apache.log):
86.149.9.216 10001 17/05/2015:10:05:30 GET /presentations/logstash-monitorama-2013/images/github-contributions.png 83.149.9.216 10002 17/05/2015:10:06:53 GET /presentations/logstash-monitorama-2013/css/print/paper.css 83.149.9.216 10002 17/05/2015:10:06:53 GET /presentations/logstash-monitorama-2013/css/print/paper.css 83.149.9.216 10002 17/05/2015:10:06:53 GET /presentations/logstash-monitorama-2013/css/print/paper.css 83.149.9.216 10002 17/05/2015:10:06:53 GET /presentations/logstash-monitorama-2013/css/print/paper.css 83.149.9.216 10002 17/05/2015:10:06:53 GET /presentations/logstash-monitorama-2013/css/print/paper.css 83.149.9.216 10002 17/05/2015:10:06:53 GET /presentations/logstash-monitorama-2013/css/print/paper.css 10.0.0.1 10003 17/05/2015:10:06:53 POST /presentations/logstash-monitorama-2013/css/print/paper.css 10.0.0.1 10003 17/05/2015:10:07:53 POST /presentations/logstash-monitorama-2013/css/print/paper.css 10.0.0.1 10003 17/05/2015:10:08:53 POST /presentations/logstash-monitorama-2013/css/print/paper.css 10.0.0.1 10003 17/05/2015:10:09:53 POST /presentations/logstash-monitorama-2013/css/print/paper.css 10.0.0.1 10003 17/05/2015:10:10:53 POST /presentations/logstash-monitorama-2013/css/print/paper.css 10.0.0.1 10003 17/05/2015:10:16:53 POST /presentations/logstash-monitorama-2013/css/print/paper.css 10.0.0.1 10003 17/05/2015:10:26:53 POST /presentations/logstash-monitorama-2013/css/print/paper.css
-
Python代码
import time from pyspark import SparkConf, SparkContext, StorageLevel import os import re os.environ['SPARK_HOME'] = '/export/server/spark' if __name__ == '__main__': #1-创建上下文对象 conf=SparkConf().setAppName('test').setMaster('local[*]') sc=SparkContext(conf=conf) #设置checkpoint检查点HDFS目录 sc.setCheckpointDir('hdfs:///ckp/8-checkpoint') #2-加载数据源,形成RDD input_rdd=sc.textFile('file:///export/pyworkspace/pyspark_sz27/pyspark_core/data/apache.log') #3-转换成只有IP的RDD,\\s+表示广义的空白字符,比如空格,换行,tab键, \t\n, 多个连续空白字符也算一个空白字符。 split_rdd =input_rdd.map(lambda x:re.split('\\s+',x)[0]) #对复用的RDD的逻辑上的数据,固化到检查点 split_rdd.checkpoint() #4-计算并打印pv print('pv=',split_rdd.count()) #5-计算并打印uv print('uv=',split_rdd.distinct().count()) time.sleep(600) #6-关闭退出 sc.stop()
-
结果(checkpoint 操作切断了原RDD的依赖关系)
“checkpoint() 检查点” 和 “cache() / persist() 持久化缓存” 的区别
-
位置区别:persist 或 cache 会将RDD的数据保存在内存、磁盘、堆外内存中,但是 checkpoint 机制将RDD数据保存在HDFS上。
-
生命周期:当 Application 执行完毕,或者调用 unpersist,那么 persist 或 cache 的数据会被自动清除。但是 checkpoint 目录的内容不会自动清除,需要手动清除。
-
血缘关系:persist 或 cache 会保留RDD的血缘关系,如果某个分区的数据丢失,那么可以借助血缘关系重新计算出来。但 checkpoint 会切断依赖链不保留依赖关系,因为即使一个分区的数据丢失损坏,也能直接从HDFS的另外2个副本恢复。