我在本地模式下使用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中手动调用它。
答案 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