Spark shuffle調優

架構師springboot發表於2018-12-17

Spark shuffle是什麼 Shuffle在Spark中即是把父RDD中的KV對按照Key重新分割槽,從而得到一個新的RDD。也就是說原本同屬於父RDD同一個分割槽的資料需要進入到子RDD的不同的分割槽。

現在的spark版本預設使用的是sortshuffle;

shuffle在哪裡產生 shuffle在spark的運算元中產生,也就是執行task的時候才會產生shuffle.

sortShuffleManagerspark shuffle的預設計算引擎叫sortshuffleManager,它負責shuffle過程的執行、計算和元件的處理,sortshuffleManager會將task進行shuffle操作時產生的臨時磁碟檔案合併成一個磁碟檔案,在下一個stage的shuffle read task拉取自己的資料時,只要根據索引讀取每個磁碟檔案中的部分資料即可。

sortshuffle的內部機制

Spark shuffle調優

  1. 資料會根據不同的shuffle運算元儲存到map資料結構(如reduceByKey)或者array資料結構(join);不過Map是一邊聚合,一邊寫入記憶體,array是直接寫入記憶體. 當記憶體達到一個閾值,就會溢位寫到磁碟,因此在溢位這個環節會在磁碟上產生多個臨時檔案,磁碟上的這些檔案需要合併,於是spark就有了merge機制.
  2. 在溢寫到磁碟之前,在記憶體中會按照key來排序,排序過後會進入到一個buffer緩衝區,預設為32K,緩衝區的batch預設為1萬條key,也就是緩衝區以每次一萬條的量寫入到磁碟檔案中,該緩衝區減少IO,提高效能. 緩衝區和寫入磁碟使用的技術是java中的BufferedOutputStream.
  3. merge會將之前產生的所有的臨時檔案進行合併,包括緩衝區讀寫到磁碟上的檔案,合併成一個大的檔案到磁碟,預設為48M,與這個檔案相對於的還有一個索引檔案,索引檔案裡面記錄的是這個檔案的元資訊,且這個磁碟檔案也是下游stage的Task的輸入資訊!    注: 一個下游的task對應一個磁碟檔案和這個磁碟檔案的元資訊. 於是就有了血統,繼承之類的! shuffle當中可能會遇到的問題
  4. 資料量非常大,從其他各臺機器收集資料佔用大量網路。
  5. 資料如何分類,即如何Partition,Hash、Sort等
  6. 負載均衡(資料傾斜),因為採用不同的Shuffle方式對資料不同的分類,而分類之後又要跑到具體的節點上計算,如果不恰當的話,很容易產生資料傾斜
  7. 網路傳輸效率,需要在壓縮和解壓縮之間做出權衡,序列化和反序列也是要考慮的問題; 說明:具體的Task進行計算的時候盡一切最大可能使得資料具備Process Locality的特性;退而求次是增加資料分片,減少每個Task處理的資料量。

shuffle調優 shuffle調優分為兩種,一種是shuffle引數根據實際情況調優,一種是程式碼開發調優,程式碼開發調優我在spark效能調優裡面去寫!

  1. spark.shuffle.file.buffer(預設值為32K,每次出貨1萬條)

該引數是緩衝區的緩衝記憶體,如果可用的記憶體資源較為充足的話,可以將緩衝區的值設定大點,這樣會較少磁碟IO次數.,如果合理調節該引數,效能會提升1%~5%... 可以設定為64K. 2. spark.reducer.maxSizeInFlight(預設為48M)該引數是stage的每一個task就需要將上一個stage的計算結果中的所有相同key,從各個節點上通過網路都拉取到自己所在的節點上,然後進行key的聚合或連線等操作,如果合理調節該引數(增大),效能會提升1%~5%... 3. spark.shuffle.io.maxRetries(預設3次)該引數是stage的task向上一個stage的task計算結果拉取資料,也就是上面那個操作,有時候會因為網路異常原因,導致拉取失敗,失敗時候預設重新拉取三次,三次過還是失敗的話作業就執行失敗了,根據具體的業務可以考慮將預設值增大,這樣可以避免由於JVM的一些原因或者網路不穩定等因素導致的資料拉取失敗.也有助於提高spark作業的穩定性. 可以適當的提升重新拉取的次數,最大為60次. 4. spark.shuffle.io.retryWait(預設為5s)

該引數和上面一樣,是每次拉取資料的間隔時間... 調優建議:建議加大間隔時長(比如20s),以增加shuffle操作的穩定性 5. spark.shuffle.memoryFraction(預設0.2,也就是20%)該引數是資料根據不同的shuffle運算元將資料寫入記憶體結構中,記憶體結構達到閾值會溢位臨時檔案,這個引數就是則是記憶體結構的閾值百分比的,不是記憶體結構的記憶體大小.  如果記憶體充足,而且很少使用持久化操作,建議調高這個比例,可以減少頻繁對磁碟進行IO操作,合理調節該引數可以將效能提升10%左右. 6. spark.shuffle.manager(預設sort)該引數是設定shuffle的型別,預設是sort,也就是sortshuffleManager, hash引數對應HashShuffleManager, tungsten-sort引數對應tungsten(這個很少用),HashShuffleManager是以前的版本,這個預設就行, 7. spark.shuffle.sort.bypassMergeThreshold(預設200個)該引數是如果shuffle read task的數量小於等於200個的時候,在sortshufflemanager模式下,就會啟動ByPass sortshufflemanager...這個調優就這樣把 ,預設200挺好的. 8. spark.shuffle.consolidateFiles(預設為false)

該引數只對HashshuffleManager有效,而HashshuffleManager是spark1.2之前預設使用的版本...

感興趣可以加Java架構師群獲取Java工程化、高效能及分散式、高效能、深入淺出。高架構。效能調優、Spring,MyBatis,Netty原始碼分析和大資料等多個知識點高階進階乾貨的直播免費學習許可權 都是大牛帶飛 讓你少走很多的彎路的 群..號是:855801563 對了 小白勿進 最好是有開發經驗

注:加群要求

1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5.阿里Java高階大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!

相關文章