java.lang.OutOfMemoryError

通过spark-submit提交任务时,出现错误:
Exception in thread “main” java.lang.OutOfMemoryError: GC overhead limit exceeded

解决方案:

这两种错误之前我一直认为是executor的内存给的不够,但是仔细分析发现其实并不是executor内存给的不足,而是driver的内存给的不足。在standalone client模式下用spark-submit提交任务时(standalone模式部署时,默认使用的就是standalone client模式提交任务),我们自己写的程序(main)被称为driver,在不指定给driver分配内存时,默认分配的是512M。在这种情况下,如果处理的数据或者加载的数据很大(我是从hive中加载数据),driver就可能会爆内存,出现上面的OOM错误。

方法一:在spark-submit中指定 –driver-memory memSize参数来设定driver的jvm内存大小,可以通过spark-submit –help查看其他可以设置的参数。

eg:

./spark-submit \
–master spark://7070 \
–class $MAIN_CLASS \
–executor-memory 3G \
–total-executor-cores 10 \
–driver-memory 2g \
–name $APP_NAME \
–conf “spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps” \
“$SPARK_APP_JAR”

方法二:修改spark-defaults.conf

spark.driver.memory 20g