从pyspark手动调用spark的垃圾收集
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从pyspark手动调用spark的垃圾收集相关的知识,希望对你有一定的参考价值。
我在本地模式下使用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
这有点帮助。
根据这个article,我玩过spark的GC设置,并试图压缩RDD并将序列化器改为Kyro。这减慢了处理速度,对内存没有多大帮助。
因为我确切知道何时有空闲的cpu周期来调用GC,所以它可以帮助我了解如何在JVM中手动调用它。
答案
我相信这会在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?
另一答案
您永远不必手动调用GC。如果你有OOMException,那是因为没有更多的可用内存。您应该查找内存泄漏,也就是您在代码中保留的引用。如果释放此引用,JVM将在需要时释放空间。
以上是关于从pyspark手动调用spark的垃圾收集的主要内容,如果未能解决你的问题,请参考以下文章