Shuffle調優之合併map端輸出檔案

2021-09-27 03:13:54 字數 2265 閱讀 7471

如果不合併map端輸出檔案的話,會怎麼樣?

第乙個stage,每個task,都會給第二個stage的每個task建立乙份map端的輸出檔案

第二個stage,每個task,會到各個節點上面去,拉取第乙個stage每個task輸出的,屬於自己的那乙份檔案。

問題來了:預設的這種shuffle行為,對效能有什麼樣的惡劣影響呢?

實際生產環境的條件:

100個節點(每個節點乙個executor):100個executor

每個executor:2個cpu core

總共1000個task:每個executor平均10個task

每個節點,10個task,每個節點會輸出多少份map端檔案?10 * 1000=1萬個檔案

總共有多少份map端輸出檔案?100 * 10000 = 100萬。

shuffle中的寫磁碟的操作,基本上就是shuffle中效能消耗最為嚴重的部分。

通過上面的分析,乙個普通的生產環境的spark job的乙個shuffle環節,會寫入磁碟100萬個檔案。

磁碟io對效能和spark作業執行速度的影響,是極其驚人和嚇人的。

基本上,spark作業的效能,都消耗在shuffle中了,雖然不只是shuffle的map端輸出檔案這乙個部分,但是這裡也是非常大的乙個效能消耗點。

開啟了map端輸出檔案的合併機制之後:

第乙個stage,同時就執行cpu core個task,比如cpu core是2個,並行執行2個task;每個task都建立下乙個stage的task數量個檔案;

第乙個stage,並行執行的2個task執行完以後;就會執行另外兩個task;另外2個task不會再重新建立輸出檔案;而是復用之前的task建立的map端輸出檔案,將資料寫入上一批task的輸出檔案中。

第二個stage,task在拉取資料的時候,就不會去拉取上乙個stage每乙個task為自己建立的那份輸出檔案了;而是拉取少量的輸出檔案,每個輸出檔案中,可能包含了多個task給自己的map端輸出。

提醒一下(map端輸出檔案合併):

只有並行執行的task會去建立新的輸出檔案;下一批並行執行的task,就會去復用之前已有的輸出檔案;但是有乙個例外,比如2個task並行在執行,但是此時又啟動要執行2個task;那麼這個時候的話,就無法去復用剛才的2個task建立的輸出檔案了;而是還是只能去建立新的輸出檔案。

要實現輸出檔案的合併的效果,必須是一批task先執行,然後下一批task再執行,才能復用之前的輸出檔案;負責多批task同時起來執行,還是做不到復用的。

開啟了map端輸出檔案合併機制之後,生產環境上的例子,會有什麼樣的變化?

實際生產環境的條件:

100個節點(每個節點乙個executor):100個executor

每個executor:2個cpu core

總共1000個task:每個executor平均10個task

每個節點,2個cpu core,有多少份輸出檔案呢?2 * 1000 = 2000個

總共100個節點,總共建立多少份輸出檔案呢?100 * 2000 = 20萬個檔案

相比較開啟合併機制之前的情況,100萬個

map端輸出檔案,在生產環境中,立減5倍!

合併map端輸出檔案,對咱們的spark的效能有哪些方面的影響呢?

1、map task寫入磁碟檔案的io,減少:100萬檔案 -> 20萬檔案

2、第二個stage,原本要拉取第乙個stage的task數量份檔案,1000個task,第二個stage的每個task,都要拉取1000份檔案,走網路傳輸;合併以後,100個節點,每個節點2個cpu core,第二個stage的每個task,主要拉取100 * 2 = 200個檔案即可;網路傳輸的效能消耗是不是也大大減少

分享一下,實際在生產環境中,使用了spark.shuffle.consolidatefiles機制以後,實際的效能調優的效果:對於上述的這種生產環境的配置,效能的提公升,還是相當的客觀的。spark作業,5個小時 -> 2~3個小時。

大家不要小看這個map端輸出檔案合併機制。實際上,在資料量比較大,你自己本身做了前面的效能調優,executor上去->cpu core上去->並行度(task數量)上去,shuffle沒調優,shuffle就很糟糕了;大量的map端輸出檔案的產生。對效能有比較惡劣的影響。

這個時候,去開啟這個機制,可以很有效的提公升效能。

spark調優 shuffle調優

基於spark1.6 引數可以通過 new sparkcontext set 來設定,也可以通過命令的引數設定 conf spark.shuffle.file.buffer 預設值 32k 引數說明 該引數用於設定shuffle write task的bufferedoutputstream的buf...

spark調優 shuffle調優

每乙個shuffle的前半部分stage的task,每個task都會建立下乙個stage的task數量相同的檔案,比如下乙個stage會有100個task,那麼當前stage每個task都會建立100份檔案,會將同乙個key對應的values,一定是寫入同乙個檔案中的,也一定會將同乙個key對應的v...

Spark效能調優之Shuffle調優總結

spark底層shuffle的傳輸方式是使用netty傳輸,netty在進行網路傳輸的過程會申請堆外記憶體 netty是零拷貝 所以使用了堆外記憶體。shuffle過程中常出現的問題 常見問題一 reduce oom?問題原因 reduce task 去map端獲取資料,reduce一邊拉取資料一邊...