Spark內存溢出OOM異常:OutOfMemoryError:GC overhead limit exceeded,Java heap space的解決方案

因爲之前spark程序運算量不是特別大,關於提交時申請的集羣資源就一直沒有變動,後來數據不斷增大,導致程序出現以下異常:

java.lang.OutOfMemoryError: Java heap space

java.lang.OutOfMemoryError:GC overhead limit exceeded

spark屬性方面調整:
一般這兩個異常是由於executor或者driver內存設置的不夠導致的,driver設置過小的情況不過相對較小,一般是由於executoer內存不足導致的。 不過不論是哪種情況,我們都可以通過提交命令或者是spark的配置文件指定driver-memory和executor-memory的內存大小來解決問題。

spark-submit --master yarn-cluster --class MAIN_CLASS --executor-memory 10G --executor-cores 10 --driver-memory 2g --name APP_NAME

代碼方面調整建議:
其實當數據量越大時,越能體現出代碼質量的重要性,所以出現oom的問題也應該從代碼方向看一下是否還有調整優化的空間,特別是針對RDD操作的代碼。比如,RDD是否還需要重用進行多次操作,如果是我們就可以使用cache()和persist()選擇不同的緩存策略,不但提高下次操作時的執行效率,並且還能節省創建RDD佔用的內存。

另外Transformation 操作是延遲計算的,也就是說從一個RDD 轉換生成另一個 RDD 的轉換操作不是馬上執行,需要等到有 Action 操作的時候纔會真正觸發運算。

另外還有算子的選擇,例如:mapPartitionsToPair雖然能提高spark的執行效率,但如果數據量過大內存不足在進行算子操作時,也會有可能跑出java heap space異常
另外還有算子內操作儘量能用基本數據類型就不用引用類型,能用數組就不用集合,另外還比如字符串拼接,用StringBuffer代替+連接等等。這些方式不但可以節省空間還能增加算子的執行效率。
博主還是新手,以上均爲個人理解,但都是工作中已經實踐確認過的,如有錯誤,歡迎指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章