1. 程式人生 > >GC overhead limit exceeded : Spark

GC overhead limit exceeded : Spark

我在執行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,諸如此類。