我一直在本地模式下使用 pyspark 1.5 在我的 4 核 16GB 机器上对大约 300 万条记录 x 15 列所有字符串运行工作流。 我注意到,如果我在没有先重新启动 spark 的情况下再次运行相同的工作流程,内存就会耗尽并且我会收到内存不足异常。
由于我所有的缓存加起来大约为 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?
关于java - 从pyspark手动调用spark的垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33689536/