hadoop的shuffle和排序

2021-06-20 06:08:49 字數 1935 閱讀 4818

1.1 maptask執行內部原理

當map task開始運算,並產生中間資料時,其產生的中間結果並非直接就簡單的寫入磁碟。這中間的過程比較複雜,並且利用到了記憶體buffer來進行已經產生的部分結果的快取,並在記憶體buffer中進行一些預排序來優化整個map的效能。如上圖所示,每乙個map都會對應存在乙個記憶體buffer(mapoutputbuffer,即上圖的buffer in memory),map會將已經產生的部分結果先寫入到該buffer中,這個buffer預設是100mb大小,但是這個大小是可以根據job提交時的引數設定來調整的,該引數即為:io.sort.mb。當map的產生資料非常大時,並且把io.sort.mb調大,那麼map在整個計算過程中spill的次數就勢必會降低,map task對磁碟的操作就會變少,如果map tasks的瓶頸在磁碟上,這樣調整就會大大提高map的計算效能。map做sort和spill的記憶體結構如下如所示:

map在執行過程中,不停的向該buffer中寫入已有的計算結果,但是該buffer並不一定能將全部的map輸出快取下來,當map輸出超出一定閾值(比如100m),那麼map就必須將該buffer中的資料寫入到磁碟中去,這個過程在mapreduce中叫做spill。 

注意:按照權威指南上的描述,在寫磁碟之前,也就是說在將spill寫入到磁碟前,執行緒首先根據最終要傳送到的reduce端的資料劃分相應的分割槽。在每個分割槽上,後台執行緒按照記錄的鍵進行內排序,如果設定了conbiner,他就在排序後的輸出上進行。

map並不是要等到將該buffer全部寫滿時才進行spill,因為如果全部寫滿了再去寫spill,勢必會造成map的計算部分等待buffer釋放空間的情況。所以,map其實是當buffer被寫滿到一定程度(比如80%)時,就開始進行spill。這個閾值也是由乙個job的配置引數來控制,即io.sort.spill.percent,預設為0.80或80%。這個引數同樣也是影響spill頻繁程度,進而影響map task執行週期對磁碟的讀寫頻率的。但非特殊情況下,通常不需要人為的調整。調整io.sort.mb對使用者來說更加方便。

當map task的計算部分全部完成後,如果map有輸出,就會生成乙個或者多個spill檔案,這些檔案就是map的輸出結果。map在正常退出之前,需要將這些spill合併(merge)成乙個,所以map在結束之前還有乙個merge的過程。merge的過程中,有乙個引數可以調整這個過程的行為,該引數為:io.sort.factor。該引數預設為10。它表示當merge spill檔案時,最多能有多少並行的stream向merge檔案中寫入。比如如果map產生的資料非常的大,產生的spill檔案大於10,而io.sort.factor使用的是預設的10,那麼當map計算完成做merge時,就沒有辦法一次將所有的spill檔案merge成乙個,而是會分多次,每次最多10個stream。這也就是說,當map的中間結果非常大,調大io.sort.factor,有利於減少merge次數,進而減少map對磁碟的讀寫頻率,有可能達到優化作業的目的。

當job指定了combiner的時候,我們都知道map介紹後會在map端根據combiner定義的函式將map結果進行合併。執行combiner函式的時機有可能會是merge完成之前,或者之後,這個時機可以由乙個引數控制,即min.num.spill.for.combine(default 3),當job中設定了combiner,並且spill數最少有3個的時候,那麼combiner函式就會在merge產生結果檔案之前執行。通過這樣的方式,就可以在spill非常多需要merge,並且很多資料需要做conbine的時候,減少寫入到磁碟檔案的資料數量,同樣是為了減少對磁碟的讀寫頻率,有可能達到優化作業的目的。

上面這一部分配合著權威指南一起理解,就能對shuffle更深的的理解了。

2.1 reducetask執行內部原理

2.2 reduce side相關引數調優

感覺中間過程的好大一部分用到了本地磁碟來儲存臨時檔案,以前理解的都是hdfs,看來是錯了。

hadoop和spark的shuffle異同點

spark 裡是shufflemaptask 的輸出進行 partition 不同的 partition 送到不同的 reducer spark 裡reducer 可能是下乙個 stage 裡的shufflemaptask 也可能是 resulttask reducer 以記憶體作緩衝區,邊 shu...

Hadoop系列 Shuffle過程詳解

ok,看到這裡時,大家可以先停下來想想,如果是自己來設計這段shuffle過程,那麼你的設計目標是什麼。我想能優化的地方主要在於減少拉取資料的量及盡量使用記憶體而不是磁碟。我的分析是基於hadoop0.21.0的原始碼,如果與你所認識的shuffle過程有差別,不吝指出。我會以wordcount為例...

hadoop執行原理之shuffle

hadoop的核心思想是mapreduce,但shuffle又是mapreduce的核心。shuffle的主要工作是從map結束到reduce開始之間的過程。首先看下這張圖,就能了解shuffle所處的位置。圖中的partitions copy phase sort phase所代表的就是shuff...