Spark可以识别检查点自动化目录吗?

时间:2017-11-01 14:03:28

标签: apache-spark checkpoint

我最近学习Spark,对检查点感到困惑。

我了解到检查点可以将RDD存储在本地或HDFS目录中,并且它将截断RDD的谱系。但是如何在另一个驱动程序中获得正确的检查点文件? Spark可以自动获取路径吗?

例如,我在第一个驱动程序中检查了一个RDD,并希望在第二个驱动程序中重用它,但是第二个驱动程序不知道检查点文件的路径,是否可以重用检查点文件?

我写了一个关于checkpoint的演示。我检查了"总和" RDD,然后收集它。

val ds = spark.read.option("delimiter", ",").csv("/Users/lulijun/git/spark_study/src/main/resources/sparktest.csv")
  .toDF("dt", "org", "pay", "per", "ord", "origin")


val filtered = ds.filter($"dt" > "20171026")

val groupby = filtered.groupBy("dt")

val sum = groupby.agg(("ord", "sum"), ("pay", "max"))

sum.count()

sum.checkpoint()

sum.collect()

但是我发现在行动中触发的Spark Job"收集",RDD nerver读取检查点。是因为"总和" RDD已经存在于内存中?我对方法" computeOrReadCheckpoint"感到困惑,什么时候会读取检查点?

 /**
   * Compute an RDD partition or read it from a checkpoint if the RDD is checkpointing.
   */
  private[spark] def computeOrReadCheckpoint(split: Partition, context: TaskContext): Iterator[T] =
  {
    if (isCheckpointedAndMaterialized) {
      firstParent[T].iterator(split, context)
    } else {
      compute(split, context)
    }
  }

顺便说一下,Spark Streaming中RDD检查点和chekpointing之间的主要区别是什么?

任何帮助都将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

批处理模式下的检查点仅用于切割谱系。它不适用于在不同应用程序之间共享数据。单个RDD处于多个操作中时使用检查点数据。换句话说,它不适用于您的场景。要在应用程序之间共享数据,您应该将其写入可靠的分布式存储。

流式传输中的检查点用于在应用程序发生故障时提供容错功能。重新启动应用程序后,它可以重用检查点来还原数据和/或元数据。与批处理类似,它不是为数据共享而设计的。