2016-12-08 46 views
1

我使用saveAsObjectFile保存RDD,以便临时文件分布在驱动程序和执行程序中。在程序结束时,我想删除所有这些文件。如何删除它们?删除火花驱动程序和执行程序上的临时文件

+0

可能的重复http://stackoverflow.com/questions/30093676/apache-spark-does-not-delete-temporary-directories?rq=1 – Rumoku

+0

非常感谢。但是这篇文章主要是关于由spark系统创建的临时文件。我的文件是由我的应用程序创建的。 – user1803467

回答

1

没有通过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%防弹:例如,如果应用程序执行的一个过程执行程序崩溃,其分区可能会在其他执行程序上重新计算,因此该执行程序上的数据不会被删除。

+0

非常感谢,需要我重新分配这个rdd并将分区编号设置为等于我的火花执行器的数量?否则,如果我为火花系统的并行设置了大量数据,那么在执行器中删除的时间太多。 – user1803467

+0

如果确实分区数量非常大,重新分区可能会有所帮助,但由于这是一项快速操作(对于大多数分区,它只会检查文件是否存在),我会按原样尝试并仅在必要时进行优化。 –

+0

非常感谢,我会尝试你的建议。 – user1803467