今天准备跑自己的spark程序,但是运行过程中遇到了OutOfMemory:GC overhead limit exceeded的错误。
原以为是数据集太大,google了一番,以为是内存不够了,但是在webui一看其实数据集好像也不是很大,但是还是尝试提高了内存配置,通过提高spark.executor.memory和spark.shuffle.memoryFraction,降低spark.storage.memoryFraction,来提高机器可用的堆空间。
再次运行发现,问题依旧。在苦恼中找到Spark User Mailing List的一个问答帖,有人和我遇到了同样的问题。在帖子里发现了一个新的解释:executor core数量太多,导致了多个core之间争夺gc时间以及资源(应该主要是内存资源),最后导致大部分的时间都花在了gc上。
根据他的建议,我把core数量从4调到了1(也是挺极端的,真是为了成功运行,我拼了),方法是:由于我是spark standalone集群模式,所以直接编辑conf/spark-env.sh中的SPARK_EXECUTOR_CORES
运行,成功了。
真是不可思议,本来并行是为了提高速度和效率,但是这里却反而导致了运行失败。具体原因其实还不清楚,关于jvm的gc我也不甚了解,甚至也是今天我才尝试设置spark的其他环境参数,还是要多加学习啊!
本文转自http://www.bkjia.com/yjs/990042.html,所有权利归原作者所有。

本文分享了作者在使用Spark程序时遇到的OutOfMemory: GCOverheadlimitexceeded错误的问题,以及通过减少executor核心数从4调整到1,成功解决了内存竞争和GC时间过长导致的运行失败。文章强调了理解并行与垃圾回收(GC)之间的平衡对于高效使用Spark的重要性。
964

被折叠的 条评论
为什么被折叠?



