GC overhead limit exceeded : Spark
阿新 • • 發佈:2019-02-10
我在執行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會看到
可以看到在這個應用了,每個節點只用到了512MB,這是spark程式預設的,解決這個問題只要設定VM Options中的spark.executor.memory屬性即可。
比如用的IDEA,在Run configuration裡設定VM Options:
-Dspark.executor.memory=4g
當然,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,諸如此類。