Spark进程运行无磁盘错误异常

qojgxg4l  于 6个月前  发布在  Apache
关注(0)|答案(1)|浏览(63)

我在Google Cloud中有一个DataProc集群。
我在其中执行一个Spark应用程序。这个应用程序就像一个Web服务器。它监听请求;然后触发Spark作业(又名:Spark操作)并返回结果。集群只专用于我的Spark应用程序;没有其他作业在其中运行。集群中的每个节点都有375 GB的硬盘连接到它。
当spark应用程序完成请求时,它派生的spark作业(操作)会创建大量的shuffle数据。
我的预期是:由于spark应用程序一直在运行,它会在某个时候耗尽shuffle数据的磁盘空间(因为它一直在获取请求)。我甚至在Spark UI中监视到聚合的shuffle数据正在增长,甚至已经超过375 GB;但作业正在满足新的请求,而不会抛出任何磁盘错误异常。
在应用程序中,我也启用了外部 Shuffle 服务。
因此,很明显,应用程序正在删除shuffle数据;但不确定哪个spark进程正在删除shuffle数据。
是执行者进程本身还是运行在每个节点上的外部shuffle服务进程?还是驱动程序进程?
有人能把光。
谢谢

4bbkushb

4bbkushb1#

Spark有一个用于应用程序范围清理的组件-ContextCleaner。它运行在驱动程序上,并在ShuffleDependency示例没有引用时删除shuffle文件。

/**
 * An asynchronous cleaner for RDD, shuffle, and broadcast state.
 *
 * This maintains a weak reference for each RDD, ShuffleDependency, and Broadcast of interest,
 * to be processed when the associated object goes out of scope of the application. Actual
 * cleanup is performed in a separate daemon thread.
 */
private[spark] class ContextCleaner(
...

字符串
所以,这个过程有点依赖于JVM垃圾收集的行为。相关引用来自[SPARK-5750][SPARK-3441][SPARK-5836][CORE]下面是解释shuffle的新增文档。
我知道有一些关于 Shuffle 文件填充磁盘的担忧,但截至目前,可能会发生,因为以下一个或多个原因。

  1. GC在很长一段时间内不会启动(非常高的驱动程序内存)。解决方案通常是定期调用GC。
    1.没有超出范围的内容,因此没有任何内容是GCed的。
    1.有一些问题报告与 Shuffle 文件没有被清理在Mesos
    第三个是一个错误,我们将修复它。前两个应该在文档中澄清。
    为了减少资源释放的延迟,我将DatasetRDD变量设置为null,如果数据在不再需要时被缓存,则调用Dataset.unpersist()RDD.unpersist()函数。有关详细信息,请参阅Oracle博客中的When are Java objects eligible for garbage collection?页和Spark的RDD编程指南中的删除数据一节。
    清除器默认启用。请参阅Spark Configuration页了解更多信息。

相关问题