注意下面需要配置兩個引數:spark-submit指令碼裡面,去用--conf的方式,去新增配置;一定要注意!!!切記,不是在你的spark作業**中,用new sparkconf().set()這種方式去設定,不要這樣去設定,是沒有用的!一定要在spark-submit指令碼中去設定。
有時候,如果你的spark作業處理的資料量特別特別大,幾億資料量;然後spark作業一執行,時不時的報錯,shuffle file cannot find,executor、task lost,out of memory(記憶體溢位);
可能是說executor的堆外記憶體不太夠用,導致executor在執行的過程中,可能會記憶體溢位;然後可能導致後續的stage的task在執行的時候,可能要從一些executor中去拉取shuffle map output檔案,但是executor可能已經掛掉了,關聯的block manager也沒有了;所以可能會報shuffle output file not found;resubmitting task;executor lost;spark作業徹底崩潰。
上述情況下,就可以去考慮調節一下executor的堆外記憶體。也許就可以避免報錯;此外,有時,堆外記憶體調節的比較大的時候,對於效能來說,也會帶來一定的提公升。
spark.yarn.executor.memoryoverhead(看名字,顧名思義,針對的是基於yarn的提交模式)
預設情況下,這個堆外記憶體上限大概是300多m;後來我們通常專案中,真正處理大資料的時候,這裡都會出現問題,導致spark作業反覆崩潰,無法執行;此時就會去調節這個引數,到至少1g(1024m),甚至說2g、4g
通常這個引數調節上去以後,就會避免掉某些jvm oom的異常問題,同時呢,會讓整體spark作業的效能,得到較大的提公升。
此時呢,就會沒有響應,無法建立網路連線;會卡住;ok,spark預設的網路連線的超時時長,是60s;如果卡住60s都無法建立連線的話,那麼就宣告失敗了。
碰到一種情況,偶爾,偶爾,偶爾!!!沒有規律!!!某某file。一串file id。uuid(dsfsfd-2342vs–sdf–sdfsd)。not found。file lost。
這種情況下,很有可能是有那份資料的executor在jvm gc。所以拉取資料的時候,建立不了連線。然後超過預設60s以後,直接宣告失敗。
報錯幾次,幾次都拉取不到資料的話,可能會導致spark作業的崩潰。也可能會導致dagscheduler,反覆提交幾次stage。taskscheduler,反覆提交幾次task。大大延長我們的spark作業的執行時間。
可以考慮調節連線的超時時長。
--conf spark.core.connection.ack.wait.timeout=300
(spark core,connection,連線,ack,wait timeout,建立不上連線的時候,超時等待時長)
調節這個值比較大以後,通常來說,可以避免部分的偶爾出現的某某檔案拉取失敗,某某檔案lost掉了。。。
如何調節executor堆外記憶體與連線等待時長
注意下面需要配置兩個引數 spark submit指令碼裡面,去用 conf的方式,去新增配置 一定要注意!切記,不是在你的spark作業 中,用new sparkconf set 這種方式去設定,不要這樣去設定,是沒有用的!一定要在spark submit指令碼中去設定。有時候,如果你的spark...
spark sql 堆外記憶體溢位
執行執行spark sql 指令碼檔案,爆出對堆外記憶體溢位 gc overhead limit execeeded 錯誤如下圖,先區分發生異常是executor端還是driver端,我遇到的問題是driver端,因為最後資料匯出生成檔案,資料會在driver端收集結果集。解決方式有兩種,第一種正大...
springmvc 堆記憶體持續性增大調節
我編寫某web專案的時候發現專案執行速度會週期性變慢,然後開啟jconsole監控堆記憶體 發現堆記憶體走勢如上圖,正常情況下堆記憶體走勢應該是折線,而該圖表示,直到堆記憶體滿了之後,系統執行了full gc 堆記憶體使用率才下降,即發生了記憶體洩漏,這個問題令我百思不得其解,然後我利用mat排查原...