从pyspark手动调用spark的垃圾收集

arc*_*nic 12 python java garbage-collection apache-spark pyspark

我在本地模式下使用pyspark 1.5在我的4核16GB机器上运行了大约3百万条记录x 15列所有字符串的工作流程.我注意到如果我在没有首先重启spark的情况下再次运行相同的工作流程,则内存耗尽并且我会出现Out of Memory Exceptions.

由于我的所有缓存总计大约1 GB,我认为问题在于垃圾收集.我能够通过调用以下方式手动运行python垃圾收集器:

import gc
collected = gc.collect()
print "Garbage collector: collected %d objects." % collected
Run Code Online (Sandbox Code Playgroud)

这有点帮助.

我根据这篇文章使用了spark的GC设置,并尝试压缩RDD并将序列化器更改为Kyro.这减慢了处理速度,对内存没有多大帮助.

因为我确切知道何时有空闲的cpu周期来调用GC,所以它可以帮助我了解如何在JVM中手动调用它.

cra*_*rak 1

您永远不必手动调用 GC。如果出现 OOMException,那是因为没有更多可用内存。您应该寻找内存泄漏,也就是您在代码中保留的引用。如果您释放此引用,JVM 将在需要时释放可用空间。

  • 是的,我已多次阅读本文,但我仍然认为我的案例符合手动 GC 的条件,原因如下:调用 Python GC 是有益的,因为它考虑的是垃圾对象的数量而不是它们的大小,b。我的应用程序的性质涉及在等待用户决定时不进行计算的阶段,以及c。如果我需要运行一些内存密集型 python 功能或完全不同的应用程序怎么办?我怀疑 JVM gc 会解释这一点 (2认同)