1. 問題描述
在運行代碼之后,出現以下錯誤:
Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 107.0 failed 1 times, most recent failure: Lost task 0.0 in stage 107.0 (TID 208, localhost, executor driver): java.lang.OutOfMemoryError: GC overhead limit exceeded
經查詢之后,是由於JVM花費太長時間執行GC且只能回收很少的堆內存時拋出的
一般可以通過更改JVM啟動配置增加堆大小來解決
參考:https://blog.csdn.net/github_32521685/article/details/89953796
2. 解決過程
1. 增加idea運行或編譯內存
- file -> settings
- 搜索maven,點擊importing,修改JVM啟動項
並沒有解決問題
2. 增加spark的executor.memory和driver.memory
val sparkConf = new SparkConf()......set("spark.executor.memory","6G").set("spark.driver.memory","3G")
也沒有起作用
3. 減小executor.cores
executor core數量太多,可能會導致了多個core之間爭奪gc時間以及資源,但修改為為1仍然報錯
4. 優化代碼
沒辦法,其他方案都不行,只好試試減少計算
在需要用的RDD的原始數據集上加.cache(),進行緩存一下,它就不會重復計算,整個的計算的效率會高一些,不會出現內存溢出的問題
終於,運行成功了
3. 心得
寫代碼的時候,還是要多注意代碼的優化!!!