
MapReduce是一種可用于數(shù)據(jù)處理的編程模型,MapReduce程序本質(zhì)上是并行運行的,因此可以將大規(guī)模數(shù)據(jù)分析任務(wù)分發(fā)給任何一個擁有足夠多機器的數(shù)據(jù)中心,它的優(yōu)勢在于處理大規(guī)模數(shù)據(jù)
map和reduce
MapReduce任務(wù)可以分為兩個處理階段:map階段和reduce階段,每個階段都以鍵值對作為輸入和輸出

一些概念
job
MapReduce job 是客戶端需要執(zhí)行的一個工作單元,它包括輸入數(shù)據(jù),MapReduce程序和配置信息
task
Hadoop將 job 分成若干 task 執(zhí)行,task包括兩類:map任務(wù)和reduce任務(wù),這些任務(wù)運行在集群的節(jié)點上,并通過YARN進行調(diào)度,如果任務(wù)失敗,它將在另一個不同的節(jié)點上自動重新調(diào)度運行
split
hadoop將MapReduce的輸入數(shù)據(jù)劃分成等長的小數(shù)據(jù)塊,成為split,hadoop為每個分片創(chuàng)建一個map任務(wù)
對于大多數(shù)作業(yè)來說,一個合理的分片大小趨向于HDFS的一個塊的大小,默認是123MB
數(shù)據(jù)本地化優(yōu)化
Hadoop在儲存有輸入數(shù)據(jù)(HDFS中的數(shù)據(jù))的節(jié)點上運行map任務(wù),可以獲得最佳性能,因為它無需使用寶貴的集群帶寬資源,但是有時儲存該分片的hdfs數(shù)據(jù)塊副本所在的節(jié)點可能在運行其他的map任務(wù),此時調(diào)度需要從某一個數(shù)據(jù)塊所在的機架中的一個節(jié)點上尋找一個空閑的map槽(slot)來運行該map任務(wù)分片,僅僅在非常偶然的情況下會發(fā)生,這將導(dǎo)致機架之間發(fā)生網(wǎng)絡(luò)傳輸
思考題:為什么最近分片大小應(yīng)該與塊大小相同
思考題:為什么map任務(wù)將其輸出寫入本地磁盤,而不是HDFS
reduce
reduce任務(wù)并不具備數(shù)據(jù)本地化優(yōu)勢,單個reduce任務(wù)的輸入通常來自于所有mapper的輸出,reduce的輸出通常儲存在HDFS中以實現(xiàn)可靠儲存,reduce輸出的每個HDFS塊,第一個副本儲存在本地節(jié)點上,其他復(fù)本出于可靠性考慮儲存在其他機架的節(jié)點上
reduce數(shù)據(jù)流圖

reduce任務(wù)的數(shù)量并非由輸入數(shù)據(jù)的大小決定,相反是獨立的
partition
如果有好多個reduce任務(wù),每個map任務(wù)就會針對輸出進行分區(qū)(partition),即為每個reduce任務(wù)建一個分區(qū),每個分區(qū)有許多鍵,但每個建對應(yīng)的鍵值對記錄都在同一個分區(qū)中,分區(qū)可以由用戶定義的分區(qū)函數(shù)控制,但通常默認的partitioner通過哈希函數(shù)來分區(qū),很高效

shuffle
多個reduce任務(wù)的數(shù)據(jù)流如圖,map和reduce任務(wù)之間的數(shù)據(jù)流成為shuffle(混洗),因為每個reduce任務(wù)的輸入都來自許多map任務(wù),shuffle一般比圖中所示的更負責(zé),而且調(diào)整shuffle參數(shù)對作業(yè)總執(zhí)行時間影響比較大
當數(shù)據(jù)完全可以并行,無需shuffle時,可能出現(xiàn)無reduce任務(wù)的情況,這種情況下,唯一的非本地節(jié)點數(shù)據(jù)傳輸是map任務(wù)
combiner函數(shù)
能幫助減少mapper和reducer之間的數(shù)據(jù)傳輸量
本文完
歡迎關(guān)注我的微信訂閱號:

歡迎關(guān)注我的開發(fā)者頭條獨家號搜索:269166