从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的垃圾收集的主要内容,如果未能解决你的问题,请参考以下文章

android中的垃圾收集(手动完成)

Pyspark G1垃圾收集器

我是否必须在Java中手动实现垃圾收集?

不做标题党Java虚拟机何谓垃圾及垃圾回收算法

是否可以强制对象的垃圾收集?(java)

Spark学习之路 (十四)SparkCore的调优之资源调优JVM的GC垃圾收集器