问题描述: 在使用spark过程中,有时会因为数据增大,而出现下面两种错误: java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError:GC overhead limit exceeded 这两种错误之前我一直认为是executor的内存给的不够,但是仔细分析发现其实并不是executor内存给的不足,而是driver的内存给的不足。在standalone client模式下用spark-submit提交任务时(standalone模式部署时,默认使用的就是standalone client模式提交任务),我们自己写的程序(main)被称为driver,在不指定给driver分配内存时,默认分配的是512M。在这种情况下,如果处理的数据或者加载的数据很大(我是从hive中加载数据),driver就可能会爆内存,出现上面的OOM错误。 解决方法: 参考:http://spark.apache.org/docs/latest/configuration.html 方法一:在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_home/conf/目录中,将spark-defaults.conf.template模板文件拷贝一份到/spark_home/conf目录下,命名为spark-defaults.conf,然后在里面设置spark.driver.memory memSize属性来改变driver内存大小。 eg: spark.master spark://master:7077 spark.default.parallelism 10 spark.driver.memory 2g spark.serializer org.apache.spark.serializer.KryoSerializer spark.sql.shuffle.partitions 50
spark执行任务时出现java.lang.OutOfMemoryError: GC overhead limit exceeded和java.lang.OutOfMemoryError: java heap space 最直接的解决方式就是在spark-env.sh中将下面两个参数调节的尽量大 export SPARK_EXECUTOR_MEMORY=6000Mexport SPARK_DRIVER_MEMORY=7000M 注意,此两个参数设置需要注意大小顺序: SPARK_EXECUTOR_MEMORY < SPARK_DRIVER_MEMORY< yarn集群中每个nodemanager内存大小
总结一下Spark中各个角色的JVM参数设置: (1)Driver的JVM参数: (2)Executor的JVM参数: (3)Executor数目及所占CPU个数
|
Spark OOM:java heap space,OOM:GC overhead limit exceeded
猜你喜欢
转载自sjmz30071360.iteye.com/blog/2397767
今日推荐
周排行