似乎有一些关于此的帖子,但似乎没有人回答我的理解。
以下代码在 DataBricks 上运行:
spark.sparkContext.setCheckpointDir("/dbfs/FileStore/checkpoint/cp1/loc7")
val checkpointDir = spark.sparkContext.getCheckpointDir.get
val ds = spark.range(10).repartition(2)
ds.cache()
ds.checkpoint()
ds.count()
ds.rdd.isCheckpointed
添加了各种改进:
...
val ds2 = ds.checkpoint(eager=true)
println(ds2.queryExecution.toRdd.toDebugString)
...
返回:
(2) MapPartitionsRDD[307] at toRdd at command-1835760423149753:13 []
| MapPartitionsRDD[305] at checkpoint at command-1835760423149753:12 []
| ReliableCheckpointRDD[306] at checkpoint at command-1835760423149753:12 []
checkpointDir: String = dbfs:/dbfs/FileStore/checkpoint/cp1/loc10/86cc77b5-27c3-4049-9136-503ddcab0fa9
ds: org.apache.spark.sql.Dataset[Long] = [id: bigint]
ds2: org.apache.spark.sql.Dataset[Long] = [id: bigint]
res53: Boolean = false
问题一:
ds.rdd.isCheckpointed或ds2.rdd.isCheckpointed都返回False即使计数我有一个非懒惰的情况。为什么,特别是 ../loc 7 & 10 是用(部分)文件编写的?我们还可以看到 ReliableCheckPoint!
没有很好地解释整个概念。试图解决这个问题。
问题 2 - 次要问题:
最新版本的 Spark 2.4 是否真的需要缓存?ds 上的新分支,如果不缓存,会导致重新计算还是现在更好?不使用检查点数据似乎很奇怪,或者我们可以说 Spark 并不真正知道什么更好?
从高性能 Spark 我得到的混合印象是检查点不是那么推荐,但又是这样。