問題描述:
在使用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