spark checkpoint与磁盘持久存在的区别是什么。这两个都存储在本地磁盘中吗?
答案 0 :(得分:47)
没有什么重要的区别,但基本的是与血统发生的事情。 $PATH
/ Persist
在cache
打破血统时保持血统完好无损。让我们考虑以下示例:
checkpoint
import org.apache.spark.storage.StorageLevel
val rdd = sc.parallelize(1 to 10).map(x => (x % 3, 1)).reduceByKey(_ + _)
/ cache
:
persist
val indCache = rdd.mapValues(_ > 4)
indCache.persist(StorageLevel.DISK_ONLY)
indCache.toDebugString
// (8) MapPartitionsRDD[13] at mapValues at <console>:24 [Disk Serialized 1x Replicated]
// | ShuffledRDD[3] at reduceByKey at <console>:21 [Disk Serialized 1x Replicated]
// +-(8) MapPartitionsRDD[2] at map at <console>:21 [Disk Serialized 1x Replicated]
// | ParallelCollectionRDD[1] at parallelize at <console>:21 [Disk Serialized 1x Replicated]
indCache.count
// 3
indCache.toDebugString
// (8) MapPartitionsRDD[13] at mapValues at <console>:24 [Disk Serialized 1x Replicated]
// | CachedPartitions: 8; MemorySize: 0.0 B; ExternalBlockStoreSize: 0.0 B; DiskSize: 587.0 B
// | ShuffledRDD[3] at reduceByKey at <console>:21 [Disk Serialized 1x Replicated]
// +-(8) MapPartitionsRDD[2] at map at <console>:21 [Disk Serialized 1x Replicated]
// | ParallelCollectionRDD[1] at parallelize at <console>:21 [Disk Serialized 1x Replicated]
:
checkpoint
正如您在第一种情况中所看到的,即使从缓存中提取数据,也会保留沿袭。这意味着如果val indChk = rdd.mapValues(_ > 4)
indChk.checkpoint
// indChk.toDebugString
// (8) MapPartitionsRDD[11] at mapValues at <console>:24 []
// | ShuffledRDD[3] at reduceByKey at <console>:21 []
// +-(8) MapPartitionsRDD[2] at map at <console>:21 []
// | ParallelCollectionRDD[1] at parallelize at <console>:21 []
indChk.count
// 3
indChk.toDebugString
// (8) MapPartitionsRDD[11] at mapValues at <console>:24 []
// | ReliableCheckpointRDD[12] at count at <console>:27 []
的某些分区丢失,可以从头开始重新计算数据。在第二种情况下,在检查点之后,谱系完全丢失,indCache
不再携带重建它所需的信息。
indChk
/ checkpoint
不同, cache
与其他作业分开计算。这就是为什么RDD标记为检查点应该缓存:
强烈建议将此RDD保留在内存中,否则将其保存在文件中将需要重新计算。
最后persist
数据是持久的,并且在checkpointed
被销毁后不会删除。
关于SparkContext
使用的数据存储SparkContext.setCheckpointDir
,如果在非本地模式下运行则需要RDD.checkpoint
路径。否则它也可以是本地文件系统。没有复制的DFS
和localCheckpoint
应该使用本地文件系统。
注意强>:
RDD检查点与Spark Streaming中的chekpointing不同。前一个旨在解决沿袭问题,后一个是关于流可靠性和故障恢复。
答案 1 :(得分:25)
我想你可以找到一个非常详细的答案here
虽然很难总结该页面中的所有内容,但我会说
<强>坚持强>
<强>点检查强>
您可能需要阅读本文,了解Spark的检查点或缓存操作的更多详细信息或内部信息。
答案 2 :(得分:5)
Persist(MEMORY_AND_DISK)将数据帧临时存储到磁盘和内存而不破坏程序的谱系,即df.rdd.toDebugString()将返回相同的输出。建议在计算中使用persist(*),这将被重用以避免重新计算中间结果:
df = df.persist(StorageLevel.MEMORY_AND_DISK)
calculation1(df)
calculation2(df)
请注意,缓存数据框并不保证,它会保留在内存中,直到您下次调用它为止。根据内存使用情况,可以丢弃缓存。
checkpoint()打破了沿袭并迫使数据框存储在磁盘上。与cache()/ persist()的使用不同,频繁的检查可能会降低程序的速度。当a)在不稳定的环境中工作以允许从故障中快速恢复时,建议使用检查点b)当RDD的新条目依赖于先前的条目时存储中间计算状态,即避免在故障情况下重新计算长依赖链
答案 3 :(得分:1)
如果您检查the relevant part of the documentation,它会谈到将数据写入可靠的系统,例如HDFS。但是,由您来告诉Apache Spark在哪里写入其检查点信息。
另一方面,持久化主要是在内存中缓存数据,this part of the documentation清楚地表明了这一点。
因此,它取决于您为Apache Spark提供的目录。