1. 程式人生 > >深入解析hadoop中的小黑盒shuffle

深入解析hadoop中的小黑盒shuffle

簡介

小黑盒shuffle是用來將資料轉換成key-values陣列形式,具體思想流程加原始碼透析如圖:

這裡寫圖片描述

圖形解析

首先我們知道①InputFormat介面子類

jdk1.8原始碼: protected void map(KEYIN key, VALUEIN value, Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context) throws IOException, InterruptedException {
        context.write(key, value);
    }

MapShuffle⑩

圖中可以看到多個Mapper並行執行map()方法,多個map並行工作而且相互不影響,每個map工作結束後就會將輸出的key-value對先儲存在記憶體的快取區中,這個③快取區是環狀類似於Hash中的連結串列<只不過連結串列首尾呼應而這個環狀是上下呼應那種>一樣對資料進行放置,但是快取區是有預設記憶體的,這時候程式會多開闢一條執行緒SpillThread對快取區進行實時監控,

//原始碼MapTask類
        protected class SpillThread extends Thread {
            protected SpillThread() {
            }

當資料儲存過大就會將記憶體快取區中的資料溢寫到spill到本地磁碟中去

ReduceShuffle⑪

然後開始執行ReduceShuffle,直到這裡MapShuffle階段完成後會出現臨近的和相同的key⑤排序著,而且每個key會對應多種多樣的value,而ReduceShuffle階段的目的就是為了讓相同的key的所有value合併到一起然後進行上下排序的過程。圖中可以看出這是一個MapShuffle的執行原理,當4個Mapper並行執行map()方法的時候,會出現每個map()在執行的過程時⑥,就可能會有相同的key,這個key可能對應相同的value也可能對應不同的value,ReduceShuffle執行會將相同的key就行歸併,歸併的方式可能是2個或者3個等不定<可以在配置中調節>不同的進行資料合併也就是說key中會對應2個或者多個不同的value⑦,然後在次排序,用同樣的方法進行排序,⑧最後的到的就是key-values的陣列形式,每個過程排序+合併,最終的結構就是key—values的陣列形式並且每個key上下排序著; 排序後生成的大檔案放在map程式本機的本地磁碟,⑨並且等待reduce()來拷貝資料; !!

當執行到此處,可以進行以下兩個可設定的操作:

-1- Combiner(map端的reduce),檔案合併的時候,可以執行reduce端操作(將相同key的value合併在一起),這種操作不是每個reduce程式都可以進行,只有不影響最終結果的情況下,才能夠進行Combiner操作。 

-2- 壓縮:在此處可以將合併後的大檔案進行壓縮,壓縮後可以減少磁碟的佔用量,當reduce copy時也可以減少網路IO

這樣一個完整的小黑盒shuffle處理就結束了.曹天部落格地址

這裡寫圖片描述