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

我一直在本地模式下使用pyspark 1.5在我的4核16GB计算机上对大约300万条记录x 15列所有字符串运行工作流。我注意到,如果我在没有首先重新启动 spark 的情况下再次运行相同的工作流,内存就会耗尽,并且会出现内存不足异常。

由于我的所有缓存总计约为1 GB,因此我认为问题在于垃圾回收。我能够通过调用来手动运行python垃圾回收器:

import gc
collected = gc.collect()
print "Garbage collector: collected %d objects." % collected

这有一点帮助。

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

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


答案 1

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


答案 2

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

spark.sparkContext._jvm.System.gc()

另请参阅:如何在Java中强制垃圾回收?

和:Java:你如何真正使用JVMTI的ForceGargabeCollection强制GC?