1.分布式并行計算
MapReduce框架是由jobTracker和TaskTracker這兩類服務調度的。JobTracker是主控服務,只有一個,負責調度和管理TaskTracker,把Map任務和Reduce任務分配給空閑的TaskTmcker,讓這些任務并行運行,并負責監控任務的運行情況。TaskTracker是從服務,可以有多個,負責執行任務。如果某個TaskTracker出故障了,JobTracker會把其負責的任務分配給其他空閑的TaskTracker重新運行。
2.本地計算
通常,MapReduce框架和分布式文件系統是運行在一組相同的節點上的,也就是說,計算節點和存儲節點通常在一起。這種配置允許框架在那些存儲數據的節點上高效地調度任務,這可以使整個集群的網絡帶寬被非常髙效地利用。
3.任務粒度
對于小數據集,一般小于或等于HDFS中數據塊的大小,這使得一個小數據集位于一臺計算機上,有利于計算的數據本地性。一個小數據集啟動一個Map任務,M個Map任務可以在臺計算機上并行運行,用戶可以指定Reduce任務的數量。
4.Combine (連接)
Combine將Map任務輸出的中間結果集中有相同key值的多個<key,value>組合成一個<key,list(value)>對。Combine在執行完Map函數后緊接著執行,很多情況下可以直接使用Reduce函數,Combine能減少中間結果的數量,從而減少數據傳輸中的網絡流量。
5.Partition (分區)
Combine之后,把產生的中間結果按key的范圍劃分成及份(及是預先定義的Reduce任務的個數)。劃分時通常使用Hash函數,如hash(key)mod R,這樣可以保證某一范圍內的key,一定是由一個Reduce任務來處理,可以簡化Reduce的過程。
6.讀取中間結果
Map任務的中間結果在做完Combine和Partition之后,以文件形式存于本地磁盤。中間結果文件的位置會通知主控JobTracker,JobTracker再通知Reduce任務到哪一個DataNode上去取中間結果。注意所有的Map任務產生中間結果均按其key用同一個Hash函數劃分成了R份,R個Reduce任務各自負責一段key區間。每個Reduce需要向多個Map任務節點取得落在其負責的key區間內的中間結果,然后執行Reduce函數,形成一個最終的結果文件。
7.任務管道
在某些情況下Reduce任務的輸出結果并非所需要的最終結果,這時可以將這些輸出結果作為另一個計算任務的輸入開始另一個MaPReduce計算任務。