PySpark:全面清洁检查站

时间:2018-10-03 15:39:39

标签: apache-spark pyspark

根据documentation,可以告诉Spark跟踪“超出范围” 检查点-不再需要的检查点,并从磁盘中清除它们。

SparkSession.builder
  ...
  .config("spark.cleaner.referenceTracking.cleanCheckpoints", "true")
  .getOrCreate()

显然是这样做的,但是问题是,从未删除最后一个检查点的rdds。

问题

  • 执行所有清理时是否缺少任何配置?
  • 如果没有:有什么方法可以获取为特定应用程序创建的临时文件夹的名称,以便可以通过编程方式将其删除?即从0c514fb8-498c-4455-b147-aff242bd7381获取SparkContext的方式与获取applicationId
  • 的方法相同

2 个答案:

答案 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" !