本文主要是介绍GC overhead limit exceeded : Spark,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我在运行Spark程序的时候报错
java.lang.OutOfMemoryError:GC overhead limit exceeded
伴随着通常有:
java.lang.OutOfMemoryError:Java heap spaceorg.apache.spark.shuffle.FetchFailedException:Failed to connect to ...
这是因为executor的内存不足,导致GC杀死一些任务
登录 http://Master:8080会看到
可以看到在这个应用了,每个节点只用到了512MB,这是spark程序默认的,解决这个问题只要设置VM Options中的spark.executor.memory属性即可。
比如用的IDEA,在Run configuration里设置VM Options:
-Dspark.executor.memory=4g
当然,executor.memory的大小肯定要小于节点的内存大小,不然这个参数设置毫无意义。而节点内存的大小你可以通过登录http://Master:8080(上图)中Workers信息里面看。
若你增加了实际内存,想修改worker内存的值,则在${SPARK_HOME}/conf/spark-env.sh里面修改:
export SPARK_WORKER_MEMORY=8g
export SPARK_EXECUTOR_MEMORY=8g
export SPARK_DAEMON_MEMORY=8g
这里其实是各种模式下都设置了,可以根据实际情况参照该文档注释进行个性化设置。
重启Spark后生效,可以登录webui(http://Master:8080)去查看更改成功了没。
上述方法其实治标不治本,更有效的方法当然是优化代码,如某个RDD不用了,可以把它unpersist,诸如此类。
这篇关于GC overhead limit exceeded : Spark的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!