Spark 效能調優--Shuffle調優 SortShuffleManager
shuffle調優
上一篇介紹了HashShuffleManager,這次介紹SortShuffleManager
SortShuffleManager執行原理
SortShuffleManager的執行機制主要分成兩種,一種是普通執行機制,另一種是bypass執行機制。當shuffle read task的數量小於等於spark.shuffle.sort.bypassMergeThreshold引數的值時(預設為200),就會啟用bypass機制。
普通執行機制
下圖說明了普通的SortShuffleManager的原理。在該模式下,資料會先寫入一個記憶體資料結構中,此時根據不同的shuffle運算元,可能選用不同的資料結構。
如果是reduceByKey這種聚合類的shuffle運算元,那麼會選用Map資料結構,一邊通過Map進行聚合,一邊寫入記憶體;如果是join這種普通的shuffle運算元,那麼會選用Array資料結構,直接寫入記憶體。
接著,每寫一條資料進入記憶體資料結構之後,就會判斷一下,是否達到了某個臨界閾值。如果達到臨界閾值的話,那麼就會嘗試將記憶體資料結構中的資料溢寫到磁碟,然後清空記憶體資料結構。
在溢寫到磁碟檔案之前,會先根據key對記憶體資料結構中已有的資料進行排序。排序過後,會分批將資料寫入磁碟檔案。預設的batch數量是10000條,也就是說,排序好的資料,會以每批1萬條資料的形式分批寫入磁碟檔案。寫入磁碟檔案是通過Java的BufferedOutputStream實現的。BufferedOutputStream是Java的緩衝輸出流,首先會將資料緩衝在記憶體中,當記憶體緩衝滿溢之後再一次寫入磁碟檔案中,這樣可以減少磁碟IO次數,提升效能。
一個task將所有資料寫入記憶體資料結構的過程中,會發生多次磁碟溢寫操作,也就會產生多個臨時檔案。最後會將之前所有的臨時磁碟檔案都進行合併,這就是merge過程,此時會將之前所有臨時磁碟檔案中的資料讀取出來,然後依次寫入最終的磁碟檔案之中。此外,由於一個task就只對應一個磁碟檔案,也就意味著該task為下游stage的task準備的資料都在這一個檔案中,因此還會單獨寫一份索引檔案,其中標識了下游各個task的資料在檔案中的start offset與end offset。
SortShuffleManager由於有一個磁碟檔案merge的過程,因此大大減少了檔案數量。比如第一個stage有50個task,總共有10個Executor,每個Executor執行5個task,而第二個stage有100個task。由於每個task最終只有一個磁碟檔案,因此此時每個Executor上只有5個磁碟檔案,所有Executor只有50個磁碟檔案。
bypass執行機制
下圖說明了bypass SortShuffleManager的原理。bypass執行機制的觸發條件如下:
- shuffle map task數量小於spark.shuffle.sort.bypassMergeThreshold引數的值。
- 不是聚合類的shuffle運算元(比如reduceByKey)。
此時task會為每個下游task都建立一個臨時磁碟檔案,並將資料按key進行hash然後根據key的hash值,將key寫入對應的磁碟檔案之中。當然,寫入磁碟檔案時也是先寫入記憶體緩衝,緩衝寫滿之後再溢寫到磁碟檔案的。最後,同樣會將所有臨時磁碟檔案都合併成一個磁碟檔案,並建立一個單獨的索引檔案。
該過程的磁碟寫機制其實跟未經優化的HashShuffleManager是一模一樣的,因為都要建立數量驚人的磁碟檔案,只是在最後會做一個磁碟檔案的合併而已。因此少量的最終磁碟檔案,也讓該機制相對未經優化的HashShuffleManager來說,shuffle read的效能會更好。
而該機制與普通SortShuffleManager執行機制的不同在於:
第一,磁碟寫機制不同;
第二,不會進行排序。
也就是說,啟用該機制的最大好處在於,shuffle write過程中,不需要進行資料的排序操作,也就節省掉了這部分的效能開銷。
相關文章
- Spark shuffle調優Spark
- Spark 效能調優--資源調優Spark
- Spark效能調優Spark
- Spark面試題(八)——Spark的Shuffle配置調優Spark面試題
- Spark的效能調優Spark
- Spark學習——效能調優(一)Spark
- Spark學習——效能調優(二)Spark
- Spark學習——效能調優(三)Spark
- 【Spark篇】---Spark中記憶體管理和Shuffle引數調優Spark記憶體
- 【大資料學習日記】Spark之shuffle調優大資料Spark
- spark效能調優指南高階篇Spark
- Spark 效能調優--開發階段Spark
- 快取Apache Spark RDD - 效能調優快取ApacheSpark
- Spark(十三) Spark效能調優之RDD持久化Spark持久化
- 【Spark篇】---Spark調優之程式碼調優,資料本地化調優,記憶體調優,SparkShuffle調優,Executor的堆外記憶體調優Spark記憶體
- Spark效能調優——9項基本原則Spark
- spark調優-背壓Spark
- 【效能調優】效能測試、分析與調優基礎
- 效能調優學習之硬體調優
- ElasticSearch效能調優Elasticsearch
- Nginx 效能調優Nginx
- iOS效能調優iOS
- php效能調優PHP
- Java效能調優Java
- oracle效能調優Oracle
- 1,Spark引數調優Spark
- Spark效能調優-RDD運算元調優篇(深度好文,面試常問,建議收藏)Spark面試
- Spark開發-Shuffle優化Spark優化
- 效能調優實戰
- 效能調優 jstackJS
- MySQL 效能調優技巧MySql
- RedHat 效能調優指南Redhat
- Oracle 效能調優 概述Oracle
- weblogic效能調優Web
- Kafka 線上效能調優Kafka
- 效能監控調優
- Spark應用程式開發引數調優深入剖析-Spark商業調優實戰Spark
- Nginx安全優化與效能調優Nginx優化