GC overhead limit exceeded : Spark

我在运行Spark程序的时候报错

java.lang.OutOfMemoryError:GC overhead limit exceeded

伴随着通常有:

java.lang.OutOfMemoryError:Java heap space

org.apache.spark.shuffle.FetchFailedException:Failed to connect to ...

这是因为executor的内存不足,导致GC杀死一些任务
登录 http://Master:8080会看到

GC overhead limit exceeded : Spark_第1张图片

可以看到在这个应用了,每个节点只用到了512MB,这是spark程序默认的,解决这个问题只要设置VM Options中的spark.executor.memory属性即可。
比如用的IDEA,在Run configuration里设置VM Options:

-Dspark.executor.memory=4g

GC overhead limit exceeded : Spark_第2张图片

当然,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,诸如此类。

你可能感兴趣的:(Spark)