本文主要以wordcount為例詳細(xì)闡述shuffle的實(shí)現(xiàn)過程
一、map方法執(zhí)行之前

我們知道,HDFS里的文件是分塊存放在Datanode上面的,而我們寫的mapper程序也是跑在各個(gè)節(jié)點(diǎn)上的。這里就涉及到一個(gè)問題,哪一個(gè)節(jié)點(diǎn)上的mapper讀哪一些節(jié)點(diǎn)上的文件塊呢?hadoop會自動將這個(gè)文件分片(split),得到好多split,這每一個(gè)split放到一個(gè)節(jié)點(diǎn)的一個(gè)mapper里面去讀。然后在每一臺有mapper任務(wù)的節(jié)點(diǎn)上都執(zhí)行了這么一個(gè)操作,將分得到的split切割成一行一行的鍵值對,然后傳給map方法。鍵是這每一行在split中的偏移量,值是每一行得到的字符串。
二、執(zhí)行map方法

寫過wordcount的朋友都知道,這個(gè)過程就是讀到每一行,切割字符串,生成鍵值對寫出去。
三、shuffle操作(一)
這個(gè)過程是在有map任務(wù)的節(jié)點(diǎn)上完成的

1. partition
將得到的鍵值對按照一定的規(guī)則分組,例如例子中將首字母為a的全部分到一組,將首字母為b的分到一組。這里只是為了講明白這個(gè)方式,進(jìn)行了過程簡化,實(shí)際不一定是分為兩組,也不一定是按照首字母分組。
2. sort
對每一個(gè)組中的鍵值對根據(jù)鍵的哈希碼排序。
3. combine
將具有相同鍵的鍵值對合成一個(gè)新的鍵值對,這個(gè)新的鍵值對的鍵是原來的鍵,鍵值是所有鍵的鍵值之和。
四、shuffle操作(二)
這個(gè)過程是在有reduce任務(wù)的節(jié)點(diǎn)上完成的。

1. 拉取partition
hadoop決定有多少個(gè)reducer的時(shí)候會規(guī)定有多少個(gè)partition,每一個(gè)reducer拉取自己要處理的那個(gè)分組的全部成員。例如,某臺節(jié)點(diǎn)要處理所有以a開頭的鍵值對,它就會將所有mapper中的以a開頭的那一組全部拉取過來。
2. merge
在每一個(gè)reducer上,將具有相同鍵的鍵值對生成另外一個(gè)新的鍵值對,鍵是以前的鍵,鍵值是一個(gè)以前鍵值的集合。
3. sort
在每一臺reducer節(jié)點(diǎn)上,將新生成的鍵值對進(jìn)行排序,根據(jù) 哈希碼值。
五、reduce操作

寫過wordcount的朋友都知道,在reduce方法中,hadoop回傳過來一個(gè)一個(gè)的鍵值對,鍵是每一個(gè)單詞,鍵值就是四中新生成的鍵值對的鍵值。執(zhí)行reduce操作,就是將每一個(gè)鍵值對中的鍵值累加起來。然后以鍵值對的形式將結(jié)果寫出去。
六、文件寫入HDFS

在每一臺reducer節(jié)點(diǎn)上將文件寫入,實(shí)際上是寫成一個(gè)一個(gè)的文件塊,但對外的表現(xiàn)形式是一整個(gè)大的結(jié)果文件。