根据documentation,可以告诉Spark跟踪“超出范围” 检查点-不再需要的检查点,并从磁盘中清除它们。
SparkSession.builder
...
.config("spark.cleaner.referenceTracking.cleanCheckpoints", "true")
.getOrCreate()
显然是这样做的,但是问题是,从未删除最后一个检查点的rdds。
0c514fb8-498c-4455-b147-aff242bd7381
获取SparkContext
的方式与获取applicationId
答案 0 :(得分:0)
我知道它的老问题,但是最近我正在探索checkpoint
,并且遇到了类似的问题。想分享调查结果。
问题:执行所有清理操作时,我是否缺少任何配置?
设置spark.cleaner.referenceTracking.cleanCheckpoints=true
有时会起作用,但很难依靠它。官方文件说,购买要设置此属性
如果引用超出范围,则清除检查点文件
我不知道这到底意味着什么,因为我的理解是,一旦spark会话/上下文停止,就应该清理它。
但是 ,我找到了您以下问题的答案
如果没有:是否有任何方法可以获取临时名称 为特定应用程序创建的文件夹,这样我就可以以编程方式 删除它?即从获取0c514fb8-498c-4455-b147-aff242bd7381 以相同的方式获取SparkContext的applicationId
是,我们可以得到如下的checkpointed
目录:
scala:
//Set directory
scala> spark.sparkContext.setCheckpointDir("hdfs:///tmp/checkpoint/")
scala> spark.sparkContext.getCheckpointDir.get
res3: String = hdfs://<name-node:port>/tmp/checkpoint/625034b3-c6f1-4ab2-9524-e48dfde589c3
//It gives String so we can use org.apache.hadoop.fs to delete path
PySpark:
// Set directory
>>> spark.sparkContext.setCheckpointDir('hdfs:///tmp/checkpoint')
>>> t = sc._jsc.sc().getCheckpointDir().get()
>>> t
u'hdfs://<name-node:port>/tmp/checkpoint/dc99b595-f8fa-4a08-a109-23643e2325ca'
// notice 'u' at the start which means It returns unicode object
// Below are the steps to get hadoop file system object and delete
>>> fs = sc._jvm.org.apache.hadoop.fs.FileSystem.get(sc._jsc.hadoopConfiguration())
fs.exists(sc._jvm.org.apache.hadoop.fs.Path(str(t)))
True
>>> fs.delete(sc._jvm.org.apache.hadoop.fs.Path(str(t)))
True
答案 1 :(得分:0)
在 Scala 中,没有文件系统,您可以使用以下代码删除任何 hdfs 目录
scala> s"hdfs dfs -rmr checkpoint-directory-path" !