spark检查点和持久存储到磁盘之间有什么区别

时间:2016-02-01 10:06:16

标签: apache-spark

spark checkpoint与磁盘持久存在的区别是什么。这两个都存储在本地磁盘中吗?

4 个答案:

答案 0 :(得分:47)

没有什么重要的区别,但基本的是与血统发生的事情。 $PATH / Persistcache打破血统时保持血统完好无损。让我们考虑以下示例:

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路径。否则它也可以是本地文件系统。没有复制的DFSlocalCheckpoint应该使用本地文件系统。

注意

RDD检查点与Spark Streaming中的chekpointing不同。前一个旨在解决沿袭问题,后一个是关于流可靠性和故障恢复。

答案 1 :(得分:25)

我想你可以找到一个非常详细的答案here

虽然很难总结该页面中的所有内容,但我会说

<强>坚持

  • 使用StorageLevel.DISK_ONLY进行持久化或缓存会导致计算RDD的生成并将其存储在某个位置,以便后续使用该RDD在重新计算行列时不会超出该点。
  • 在调用persist之后,Spark仍会记住RDD的谱系,即使它没有调用它。
  • 其次,在应用程序终止后,缓存被清除或文件被销毁

<强>点检查

  • 检查点将rdd物理存储到hdfs并销毁创建它的谱系。
  • 即使在Spark应用程序终止后,也不会删除检查点文件。
  • 检查点文件可用于后续作业运行或驱动程序
  • 检查点RDD会导致双重计算,因为在执行计算和写入检查点目录的实际工作之前,操作将首先调用缓存。

您可能需要阅读本文,了解Spark的检查点或缓存操作的更多详细信息或内部信息。

答案 2 :(得分:5)

  1. Persist(MEMORY_AND_DISK)将数据帧临时存储到磁盘和内存而不破坏程序的谱系,即df.rdd.toDebugString()将返回相同的输出。建议在计算中使用persist(*),这将被重用以避免重新计算中间结果:

    df = df.persist(StorageLevel.MEMORY_AND_DISK)
    calculation1(df)
    calculation2(df)
    

    请注意,缓存数据框并不保证,它会保留在内存中,直到您下次调用它为止。根据内存使用情况,可以丢弃缓存。

  2. 另一方面,
  3. checkpoint()打破了沿袭并迫使数据框存储在磁盘上。与cache()/ persist()的使用不同,频繁的检查可能会降低程序的速度。当a)在不稳定的环境中工作以允许从故障中快速恢复时,建议使用检查点b)当RDD的新条目依赖于先前的条目时存储中间计算状态,即避免在故障情况下重新计算长依赖链

答案 3 :(得分:1)

如果您检查the relevant part of the documentation,它会谈到将数据写入可靠的系统,例如HDFS。但是,由您来告诉Apache Spark在哪里写入其检查点信息。

另一方面,持久化主要是在内存中缓存数据,this part of the documentation清楚地表明了这一点。

因此,它取决于您为Apache Spark提供的目录。