1、前述網絡
Spark內存管理ide
Spark執行應用程序時,Spark集羣會啓動Driver和Executor兩種JVM進程,Driver負責建立SparkContext上下文,提交任務,task的分發等。Executor負責task的計算任務,並將結果返回給Driver。同時須要爲須要持久化的RDD提供儲存。Driver端的內存管理比較簡單,這裏所說的Spark內存管理針對Executor端的內存管理。性能
Spark內存管理分爲靜態內存管理和統一內存管理,Spark1.6以前使用的是靜態內存管理,Spark1.6以後引入了統一內存管理。大數據
靜態內存管理中存儲內存、執行內存和其餘內存的大小在 Spark 應用程序運行期間均爲固定的,但用戶能夠應用程序啓動前進行配置。優化
統一內存管理與靜態內存管理的區別在於儲存內存和執行內存共享同一塊空間,能夠互相借用對方的空間。編碼
Spark1.6以上版本默認使用的是統一內存管理,能夠經過參數spark.memory.useLegacyMode 設置爲true(默認爲false)使用靜態內存管理。spa
2、具體細節blog
一、靜態內存管理分佈圖排序
二、統一內存管理分佈圖索引
三、reduce 中OOM如何處理?
拉取數據的時候一次都放不下,放下的話能夠溢寫磁盤
1) 減小每次拉取的數據量
2) 提升shuffle聚合的內存比例
3) 提升Excutor的總內存
四、Shuffle調優
spark.shuffle.file.buffer
默認值:32k
參數說明:該參數用於設置shuffle write task的BufferedOutputStream的buffer緩衝大小。將數據寫到磁盤文件以前,會先寫入buffer緩衝中,待緩衝寫滿以後,纔會溢寫到磁盤。
調優建議:若是做業可用的內存資源較爲充足的話,能夠適當增長這個參數的大小(好比64k,必定是成倍的增長),從而減小shuffle write過程當中溢寫磁盤文件的次數,也就能夠減小磁盤IO次數,進而提高性能。在實踐中發現,合理調節該參數,性能會有1%~5%的提高。
spark.reducer.maxSizeInFlight
默認值:48m
參數說明:該參數用於設置shuffle read task的buffer緩衝大小,而這個buffer緩衝決定了每次可以拉取多少數據。
調優建議:若是做業可用的內存資源較爲充足的話,能夠適當增長這個參數的大小(好比96m),從而減小拉取數據的次數,也就能夠減小網絡傳輸的次數,進而提高性能。在實踐中發現,合理調節該參數,性能會有1%~5%的提高。
spark.shuffle.io.maxRetries
默認值:3
參數說明:shuffle read task從shuffle write task所在節點拉取屬於本身的數據時,若是由於網絡異常致使拉取失敗,是會自動進行重試的。該參數就表明了能夠重試的最大次數。若是在指定次數以內拉取仍是沒有成功,就可能會致使做業執行失敗。
調優建議:對於那些包含了特別耗時的shuffle操做的做業,建議增長重試最大次數(好比60次),以免因爲JVM的full gc或者網絡不穩定等因素致使的數據拉取失敗。在實踐中發現,對於針對超大數據量(數十億~上百億)的shuffle過程,調節該參數能夠大幅度提高穩定性。
shuffle file not find taskScheduler不負責重試task,由DAGScheduler負責重試stage
spark.shuffle.io.retryWait
默認值:5s
參數說明:具體解釋同上,該參數表明了每次重試拉取數據的等待間隔,默認是5s。
調優建議:建議加大間隔時長(好比60s),以增長shuffle操做的穩定性。
spark.shuffle.memoryFraction
默認值:0.2
參數說明:該參數表明了Executor內存中,分配給shuffle read task進行聚合操做的內存比例,默認是20%。
調優建議:在資源參數調優中講解過這個參數。若是內存充足,並且不多使用持久化操做,建議調高這個比例,給shuffle read的聚合操做更多內存,以免因爲內存不足致使聚合過程當中頻繁讀寫磁盤。在實踐中發現,合理調節該參數能夠將性能提高10%左右。
spark.shuffle.manager
默認值:sort|hash
參數說明:該參數用於設置ShuffleManager的類型。Spark 1.5之後,有三個可選項:hash、sort和tungsten-sort。HashShuffleManager是Spark 1.2之前的默認選項,可是Spark 1.2以及以後的版本默認都是SortShuffleManager了。tungsten-sort與sort相似,可是使用了tungsten計劃中的堆外內存管理機制,內存使用效率更高。
調優建議:因爲SortShuffleManager默認會對數據進行排序,所以若是你的業務邏輯中須要該排序機制的話,則使用默認的SortShuffleManager就能夠;而若是你的業務邏輯不須要對數據進行排序,那麼建議參考後面的幾個參數調優,經過bypass機制或優化的HashShuffleManager來避免排序操做,同時提供較好的磁盤讀寫性能。這裏要注意的是,tungsten-sort要慎用,由於以前發現了一些相應的bug。
spark.shuffle.sort.bypassMergeThreshold
默認值:200
參數說明:當ShuffleManager爲SortShuffleManager時,若是shuffle read task的數量小於這個閾值(默認是200),則shuffle write過程當中不會進行排序操做,而是直接按照未經優化的HashShuffleManager的方式去寫數據,可是最後會將每一個task產生的全部臨時磁盤文件都合併成一個文件,並會建立單獨的索引文件。
調優建議:當你使用SortShuffleManager時,若是的確不須要排序操做,那麼建議將這個參數調大一些,大於shuffle read task的數量。那麼此時就會自動啓用bypass機制,map-side就不會進行排序了,減小了排序的性能開銷。可是這種方式下,依然會產生大量的磁盤文件,所以shuffle write性能有待提升。
spark.shuffle.consolidateFiles
默認值:false
參數說明:若是使用HashShuffleManager,該參數有效。若是設置爲true,那麼就會開啓consolidate機制,會大幅度合併shuffle write的輸出文件,對於shuffle read task數量特別多的狀況下,這種方法能夠極大地減小磁盤IO開銷,提高性能。
調優建議:若是的確不須要SortShuffleManager的排序機制,那麼除了使用bypass機制,還能夠嘗試將spark.shffle.manager參數手動指定爲hash,使用HashShuffleManager,同時開啓consolidate機制。在實踐中嘗試過,發現其性能比開啓了bypass機制的SortShuffleManager要高出10%~30%。
五、Shuffle調優設置
SparkShuffle調優配置項如何使用?
1) 在代碼中,不推薦使用,硬編碼。
new SparkConf().set(「spark.shuffle.file.buffer」,」64」)
2) 在提交spark任務的時候,推薦使用。
spark-submit --conf spark.shuffle.file.buffer=64 –conf ….
3) 在conf下的spark-default.conf配置文件中,不推薦,由於是寫死後全部應用程序都要用。