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

时间:2015-11-13 09:29:01

标签: java python apache-spark garbage-collection pyspark

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

由于我的所有缓存总计大约1 GB,我认为问题在于垃圾收集。我能够通过调用:

手动运行python垃圾收集器
import gc
collected = gc.collect()
print "Garbage collector: collected %d objects." % collected

这有点帮助。

我根据这个article使用了spark的GC设置,并尝试压缩RDD并将序列化程序更改为Kyro。这减慢了处理速度,对记忆没有多大帮助。

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

3 个答案:

答案 0 :(得分:1)

我相信这将触发JVM中的GC(提示):

spark.sparkContext._jvm.System.gc()

另请参阅:How to force garbage collection in Java?

和:Java: How do you really force a GC using JVMTI's ForceGargabeCollection?

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这还不可能,在所有执行器上都有一些有关执行“管理任务”的票据:

但尚未完成。

您可以在执行工作程序代码时尝试调用JVM GC,这将起作用。例如,在进行RDD映射时,但是我敢肯定,通过适当的调整,您可以摆脱OOM。

最重要的设置是关于Java Heap和RDD高速缓存之间的分数:spark.memory.fraction,有时最好将其设置为一个非常低的值(例如0.1),有时还要增加它。

更多信息,https://spark.apache.org/docs/2.2.0/tuning.html#memory-management-overview