【SPARK-CORE】checkpoint机制
本文主要介绍SPARK RDD的checkpoinnt机制
checkpoint机制介绍
checkpoint是将RDD保存到可靠的存储中的机制,主要目的是提高应用的容错能力和持久性。Checkpointing 将数据从内存中转移到磁盘存储,使得在出现节点故障时,Spark 可以从存储中恢复数据,而不需要重新计算所有的数据。这在复杂的数据处理应用程序中尤为重要。
如何使用
- 指定checkpoint目录
- 调用checkpoint方法
- 执行action算子,触发job
val conf = new SparkConf().setAppName("Checkpoint Example") val sc = new SparkContext(conf) // 指定checkpoint目录 sc.setCheckpointDir("hdfs://path/to/checkpoint/dir") val rdd = sc.parallelize(Seq(1, 2, 3, 4, 5)) // 显示的调用checkpoint() rdd.checkpoint() // 执行 action 以触发 checkpoint rdd.count()
Checkpoint 的原理
-
触发条件:
- Checkpoint 并不会立即执行,必须要有 action 操作(如
count()
、collect()
等)触发。
- Checkpoint 并不会立即执行,必须要有 action 操作(如
-
血统图重置:
- 当 RDD 被 checkpoint 之后,其血统图将被重置,只包含到 checkpoint 文件的引用。这极大地减少了 DAG 的复杂性和计算开销。
-
可靠存储:
- Checkpoint 数据被存储在设置的 checkpoint 目录中,该目录应在可靠的存储系统中,如 HDFS。
-
恢复机制:
- 在发生节点故障时,Spark 可以从 checkpoint 目录中恢复数据,而不必重新计算所有 RDD。
使用技巧
由于checkpoint会触发算子的重新计算然后保存计算结果到指定的目录,因此在调用checkpoint方法之前最好对算子进行一个持久化操作,这样可以确保 RDD 在内存中或磁盘上有一个缓存副本,减少重复计算的开销。目前spark还不支持异步checkpoint
rdd = spark.read.json('hdfs://data/xx') res = rdd.map(data => line.split(',')).filter(data=>xxx) // 先对数据进行一个缓存 res.persist() // 1.设置checkpoint目录 // 2.checkpoint res.checkpoint() // 3. action触发job res.collect()