Spark性能調優---JVM調優之調節executor堆外內存與連接等待時長

一、executor堆外內存

①理論

在實際項目中,有時候需要處理大量的數據,比如上億、數十億條數據,發現項目時不時地報錯:shuffle file not found,executor lost,task lost,out of memory等等。

之所以出現上述問題,可能是因爲executor的堆外內存不足,導致executor在運行的過程中,內存溢出。後續stage的task在運行的時候,可能要從之前的executor中拉取shuffle map output file文件,此時executor已經掛掉,關聯的BlockManager也掛掉了,找不到文件。此時可能會報shuffle output file not found,resubmitting task,executor lost,導致spark作業徹底崩潰。

出現這種情況,可以調節一下executor的堆外內存,這樣可以避免報錯,也可能會帶來性能的提升。

②參數調節

--conf spark.yarn.executor.memoryOverhead=2048

這個參數是在是spark-submit腳本里面設置,不是在spark代碼裏面設置。

默認情況下,堆外內存的大小是300M,但通常會影響spark作業的運行,需要調節這個參數到1024M、2048M或者更大。

調節完這個參數,可以避免某些JVM OOM(內存溢出)的問題,同時使整個spark作業的性能得到很大的提升。

二、連接等待時長

①理論

executor在讀取數據時,優先從本地關聯的BlockManager中讀取。讀取不到時,會通過TransferService去遠程連接其他節點的executor的BlockManager讀取數據。

這個時候,如果碰到executor的JVM在進行垃圾回收或其他操作,建立連接失敗讀取不到數據時,程序會卡住,並進入等待狀態。spark默認的網絡連接的超時時長爲60s,60s後如果還是無法連接,則宣告失敗。此時會報錯。幾次嘗試之後,還是獲取不到數據,會導致spark作業奔潰,也可能導致DAGSchedule反覆提交幾次stage,TaskSchedule反覆提交幾次task,這樣會大大延長spark作業的時間。

此時,可以考慮調節連接的超時時長,比如設置成600秒:

--conf spark.core.connection.ack.wait.timeout=600

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