MapReduce是一種編程模型,用于大規(guī)模數(shù)據(jù)集的并行運(yùn)算
在進(jìn)行MapReduce計(jì)算任務(wù)的時(shí)候,任務(wù)被分為兩個(gè)階段:Map階段和Reduce階段。每個(gè)階段都是用鍵值對(duì)(key/value)形式作為輸入(input)和輸出(output)
MapReduce采用的是“分而治之”的策略,一個(gè)大規(guī)模數(shù)據(jù)集會(huì)被切分成許多獨(dú)立的分片,這些分片可以被多個(gè)Map任務(wù)并行處理
MapReduce框架采用Master/Slave架構(gòu),包括一個(gè)Master和多個(gè)Slave。Master上面運(yùn)行JobTracker,Slave上面運(yùn)行TaskTracker。
MapReduce主要由4個(gè)部分組成:
- Client
用戶編寫的MapReduce程序通過Client提交到JobTracker端
用戶可通過Client提供的一些接口查看作業(yè)運(yùn)行狀態(tài) - JobTracker
JobTracker負(fù)責(zé)資源監(jiān)控和作業(yè)調(diào)度
JobTracker 監(jiān)控所有TaskTracker與Job的健康狀況,一旦發(fā)現(xiàn)失敗,就將相應(yīng)的任務(wù)轉(zhuǎn)移到其他節(jié)點(diǎn)
JobTracker 會(huì)跟蹤任務(wù)的執(zhí)行進(jìn)度、資源使用量等信息,并將這些信息告訴任務(wù)調(diào)度器,而調(diào)度器會(huì)在資源出現(xiàn)空閑時(shí),選擇合適的任務(wù)去使用這些資源 - TaskTracker
TaskTracker 會(huì)周期性地通過“心跳”將本節(jié)點(diǎn)上資源的使用情況和任務(wù)的運(yùn)行進(jìn)度匯報(bào)給JobTracker,同時(shí)接收J(rèn)obTracker 發(fā)送過來的命令并執(zhí)行相應(yīng)的操作
TaskTracker 使用“slot”等量劃分本節(jié)點(diǎn)上的資源量(CPU、內(nèi)存等)。一個(gè)Task 獲取到一個(gè)slot 后才有機(jī)會(huì)運(yùn)行,而Hadoop調(diào)度器的作用就是將各個(gè)TaskTracker上的空閑slot分配給Task使用。slot 分為Map slot 和Reduce slot 兩種,分別供MapTask 和Reduce Task 使用 - HDFS
保存作業(yè)的數(shù)據(jù)、配置信息等等,最后的結(jié)果也是保存在HDFS上面
MapReduce基本架構(gòu):

MapReduce運(yùn)行過程:

MapReduce的計(jì)算流程:
Input Split --> Map --> Combiner(optional) --> Shuffle --> Reduce --> Output

Combine:作用是把同一個(gè)key的鍵值對(duì)合并在一起,combine函數(shù)把一個(gè)map函數(shù)產(chǎn)生<key,value>對(duì)合并成一個(gè)新的<key,value>對(duì),并將新的<key,value>作為輸入到reduce函數(shù)中
Partition:作用就是把這些數(shù)據(jù)歸類,主要在Shuffle過程中按照Key值將中間結(jié)果分成R份,其中每份都有一個(gè)Reduce去負(fù)責(zé),可以通過job.setPartitionerClass()方法進(jìn)行設(shè)置,默認(rèn)的使用hashPartitioner類
Shuffle:shuffle是map和reduce中間的過程,包含兩端的Combine和Partition