我最近学习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之间的主要区别是什么?
任何帮助都将不胜感激。
谢谢!
答案 0 :(得分:1)
批处理模式下的检查点仅用于切割谱系。它不适用于在不同应用程序之间共享数据。单个RDD处于多个操作中时使用检查点数据。换句话说,它不适用于您的场景。要在应用程序之间共享数据,您应该将其写入可靠的分布式存储。
流式传输中的检查点用于在应用程序发生故障时提供容错功能。重新启动应用程序后,它可以重用检查点来还原数据和/或元数据。与批处理类似,它不是为数据共享而设计的。