一、Checkpoint案例
from pyspark import SparkContext, SparkConf
import os
os.environ['SPARK_HOME'] = '/export/server/spark'
SPARK_PYTHON = '/root/anaconda3/envs/pyspark_env/bin/python'
os.environ['PYSPARK_PYTHON'] = SPARK_PYTHON
os.environ['PYSPARK_DRIVER_PYTHON'] = SPARK_PYTHON
if __name__ == '__main__':
print('PySpark checkpoint Program')
conf = SparkConf().setAppName("miniProject").setMaster("local[*]")
sc = SparkContext.getOrCreate(conf)
sc.setCheckpointDir("file:///export/tmp_data/checkpoint1")
fileRDD = sc.textFile("file:///export/tmp_data/word.txt")
fileRDD.checkpoint()
fileRDD.count()
fileRDD.count()
print("停止PySpark SparkSession对象")
sc.stop()
二、持久化和Checkpoint的区别
一、存储位置
- Persist和Cache只能保存在本地的磁盘和内存中(或者堆外内存)
- Checkpoint可以保存数据到HDFS这类可靠的存储上
二、生命周期
- Cache和Persist的RDD在程序结束后会被清除或者手动调用unpersist方法
- Checkpoint的RDD在程序结束后依然存在,不会被删除
三、Lineage(血统、依赖链、依赖关系)
- Persist和Cache,不会丢掉RDD间的依赖链/依赖关系,因为这种缓存是不可靠的,如果出现了一些错误(例如Executor宕机),需要通过回溯依赖链重新计算出来
- Checkpoint会斩断依赖链,因为Checkpoint会把结果保存在HDFS这类存储中,更加的安全可靠,一般不需要回溯依赖链
三、持久化和Checkpoint的优先级
- 如果做了cache或persist,首先会从cache中读取数据,如果没有再从checkpoint缓存的hdfs中读取
- cache被unpersist之后从hdfs中checkpoint读取