GC overhead limit exceeded : Spark

来源:互联网 发布:java框架源码 编辑:程序博客网 时间:2024/05/29 09:55

我在运行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=8gexport SPARK_EXECUTOR_MEMORY=8gexport SPARK_DAEMON_MEMORY=8g

这里其实是各种模式下都设置了,可以根据实际情况参照该文档注释进行个性化设置。
重启Spark后生效,可以登录webui(http://Master:8080)去查看更改成功了没。

上述方法其实治标不治本,更有效的方法当然是优化代码,如某个RDD不用了,可以把它unpersist,诸如此类。

1 0
原创粉丝点击