apache-spark - Spark检查点和持久化到磁盘有什么区别

标签 apache-spark

spark 检查点和持久化到磁盘有什么区别。这些都存储在本地磁盘吗?

最佳答案

几乎没有什么重要的区别,但最根本的区别是血统方面发生的情况。 持久/缓存保持沿袭完整,而检查点破坏沿袭。让我们考虑以下示例:

import org.apache.spark.storage.StorageLevel

val rdd = sc.parallelize(1 to 10).map(x => (x % 3, 1)).reduceByKey(_ + _)
  • 缓存/持久:

    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]
    
  • 检查点:

    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 不再携带重建它所需的信息。

checkpointcache/persist 不同,是与其他作业分开计算的。这就是为什么标记为检查点的 RDD 应该被缓存:

It is strongly recommended that this RDD is persisted in memory, otherwise saving it on a file will require recomputation.

最后,检查点数据是持久的,并且在SparkContext被销毁后不会被删除。

关于RDD.checkpoint使用的数据存储SparkContext.setCheckpointDir,如果在非本地模式下运行,则需要DFS路径。否则它也可以是本地文件系统。没有复制的 localCheckpointpersist 应使用本地文件系统。

重要说明:

RDD 检查点与 Spark Streaming 中的检查点是不同的概念。前者旨在解决沿袭问题,后者则与流可靠性和故障恢复有关。

关于apache-spark - Spark检查点和持久化到磁盘有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35127720/

相关文章:

python - 如何在 Spark/Pyspark 中通过 saveAsTextFile 保存不带方括号的列表

apache-spark - 如何为 Spark RDD 中的元素分配唯一的连续编号

python - 如何在 PySpark 中从年、月和日创建日期?

python - Ubuntu 通过 apt-get 安装 apache spark

scala - Spark - Scala - 用另一个数据框中的查找值替换数据框中的值

scala - 更改 Spark 的 Hadoop 版本

python - 表之间的 PySpark 正则表达式匹配

python - 如何将 Pyspark DataFrame 写入 XML 格式?

apache-spark - EMR 上的 PySpark(步骤/作业)无法连接到 AWS Glue 数据目录,但 Zeppelin 可以

scala - 在 Scala 中追加/合并多个数据帧