Spark OOM:java heap space,OOM:GC overhead limit exceeded解決方法


問題描述:

在使用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM