Scala 删除spark驱动程序和执行器上的临时文件

Scala 删除spark驱动程序和执行器上的临时文件,scala,file,apache-spark,Scala,File,Apache Spark,我用saveAsObjectFile保存了一个RDD,这样临时文件就分布在驱动程序和执行器上了。在程序结束时,我想删除所有这些文件。如何删除它们?不支持通过Spark删除数据。但是,您可以在原始RDD上使用foreachPartition在每个分区上运行任意代码段,这意味着它将在实际保存一些数据的每个执行器上至少运行一次 因此,如果您运行删除保存到其中的文件夹的代码(确保在同一执行器上运行多次时不会失败,因为单个执行器可以容纳多个分区),您将获得所需的内容 例如,使用Apache Commons

我用saveAsObjectFile保存了一个RDD,这样临时文件就分布在驱动程序和执行器上了。在程序结束时,我想删除所有这些文件。如何删除它们?

不支持通过Spark删除数据。但是,您可以在原始RDD上使用
foreachPartition
在每个分区上运行任意代码段,这意味着它将在实际保存一些数据的每个执行器上至少运行一次

因此,如果您运行删除保存到其中的文件夹的代码(确保在同一执行器上运行多次时不会失败,因为单个执行器可以容纳多个分区),您将获得所需的内容

例如,使用Apache Commons:

// save
rdd.saveAsObjectFile("/my/path")

// use data...

// before shutting down - iterate over saved RDD's partitions and delete folder:
import org.apache.commons.io.FileUtils    
rdd.foreachPartition(i =>
  // deleteDirectory doesn't fail if directory does not exist 
  FileUtils.deleteDirectory(new File("/my/path"))
)

编辑:请注意,这有点老套,可能不是100%防弹的:例如,如果在应用程序执行过程中,其中一个执行器崩溃,则其分区可能会在其他执行器上重新计算,因此不会删除该执行器上的数据。

可能重复,非常感谢。但本文主要关注spark系统创建的临时文件。我的文件是由我的应用程序创建的。非常感谢,我需要重新分区此rdd并将分区号设置为等于spark执行器的数量吗?否则,如果我为spark系统的并行性设置了一个较大的数字,那么执行器中的删除时间就会太长。如果确实分区的数量非常大,重新分区可能会有帮助,但因为这是一个快速操作(对于大多数分区,它只会检查文件是否存在)我会按原样尝试,并仅在必要时进行优化。