①map
的執行結果會被
outercollector
元件收集,
outercollector
會將資料寫入環形緩衝區內,
進行資料寫入的時候根據map輸出的
key生成乙個分割槽號,預設的是
key.hashcode()&integer_max_value%reducetask
獲取分割槽號。如果使用者自定義分割槽演算法,則按照使用者自定義的分割槽進行返回。
②環形緩衝區預設大小為100m
,閾值為
80%,當達到閾值的時候會開啟乙個溢寫執行緒,將環形緩衝區的資料向磁碟溢寫,溢寫之前需要做一些工作
③溢寫之前會會環形緩衝區內的資料進行排序,先根據分割槽號進行排序,這個排序內部是雙層 for
迴圈作用是將相同分割槽的資料寫在一起,再根據map輸出的
key值進行排序,作用是將
key相同的資料放在一起
④溢寫到磁碟,形成乙個個溢寫檔案,溢寫的時候會根據元資料到對應的原始資料中獲取原始資料進行溢寫。乙個maptask
會對應多個溢寫檔案
⑤對溢寫檔案進行歸併,在歸併的時候會再進行一次排序,排完序之後的檔案就會按分割槽和map
的key
放在一起,並且分割槽之間會有標記
⑥reducetask
會通過獲取
maptask
的執行進度,當獲取
maptask
執行完成的時候就會開啟多執行緒對
map的輸出檔案進行拷貝。拷貝的時候是按分割槽進行拷貝的。對應的
reducetask
會將對應的
maptask
的輸出檔案的對應分割槽的檔案進行拷貝
⑦由於reducetask
要針對所有的
maptask
的輸出檔案,所以拷貝過來的檔案是所有
maptask
的輸出的對應分割槽的檔案,將從各個
maptask
拷貝過來的對應分割槽檔案進行檔案的歸併和排序
⑧歸併完成後會呼叫groupcomoparator
進行分組讀取給自定義
reduce
函式,所以
reduce
函式拿到的就是一組組的資料(
key相同的為一組)
⑨按照自己定義的reduce
邏輯進行執行
⑩最終結果輸出到hdfs
對於Hadoop中shuffle的過程的理解
map端會處理輸入資料並產生中間結果,這個中間結果會寫到本地磁碟,而不是hdfs。每個map的輸出會先寫到記憶體緩衝區中,當寫入的資料達到設定的閾值時,系統將會啟動乙個執行緒緩衝區的資料寫到磁碟,這個過程叫做spill。在spill寫入之前,會先進行二次排序,首先根據資料所屬的partition進行...
hadoop的shuffle和排序
1.1 maptask執行內部原理 當map task開始運算,並產生中間資料時,其產生的中間結果並非直接就簡單的寫入磁碟。這中間的過程比較複雜,並且利用到了記憶體buffer來進行已經產生的部分結果的快取,並在記憶體buffer中進行一些預排序來優化整個map的效能。如上圖所示,每乙個map都會對...
Hadoop系列 Shuffle過程詳解
ok,看到這裡時,大家可以先停下來想想,如果是自己來設計這段shuffle過程,那麼你的設計目標是什麼。我想能優化的地方主要在於減少拉取資料的量及盡量使用記憶體而不是磁碟。我的分析是基於hadoop0.21.0的原始碼,如果與你所認識的shuffle過程有差別,不吝指出。我會以wordcount為例...