【发布时间】:2016-12-08 20:41:45
【问题描述】:
我使用 saveAsObjectFile 保存 RDD,因此临时文件分布在驱动程序和执行程序上。在程序结束时,我想删除所有这些文件。如何删除它们?
【问题讨论】:
-
非常感谢。但是这篇文章主要是关于spark系统创建的临时文件。我的文件是由我的应用程序创建的。
标签: scala file apache-spark
我使用 saveAsObjectFile 保存 RDD,因此临时文件分布在驱动程序和执行程序上。在程序结束时,我想删除所有这些文件。如何删除它们?
【问题讨论】:
标签: scala file apache-spark
没有内置支持通过 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% 防弹:例如,如果在应用程序执行期间,其中一个执行程序崩溃了,则可能会重新计算其分区其他执行者因此不会删除该执行者的数据。
【讨论】: