今天准备跑自己的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的其他环境参数,还是要多加学习啊!
时间: 2024-10-09 09:42:19