【问题标题】:Remove temporary files on spark driver and executors删除 spark driver 和 executors 上的临时文件
【发布时间】:2016-12-08 20:41:45
【问题描述】:

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

【问题讨论】:

标签: scala file apache-spark


【解决方案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% 防弹:例如,如果在应用程序执行期间,其中一个执行程序崩溃了,则可能会重新计算其分区其他执行者因此不会删除该执行者的数据。

【讨论】:

  • 非常感谢,我需要重新分区这个 rdd 并将分区号设置为等于我的 spark 执行器的数量吗?否则如果我给spark系统的并行度设置了很大的数字,那么执行器中删除的时间会太多。
  • 如果分区的数量确实非常大,重新分区可能会有所帮助,但由于这是一个快速操作(对于大多数分区,它只会检查文件是否存在)我会按原样尝试并仅在必要时进行优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多