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