一、概述
MapReduce是一種分布式計(jì)算模型,由兩個(gè)階段組成:Map和Reduce,用戶只需要實(shí)現(xiàn)map()和reduce()兩個(gè)函數(shù),即可實(shí)現(xiàn)分布式計(jì)算。
這兩個(gè)函數(shù)的形參是key、value對(duì),表示函數(shù)的輸入信息。
其中map(),輸入鍵值對(duì)<k1,v1>,輸出鍵值對(duì)<k2,v2>;
reduce(),輸入鍵值對(duì)<k2,{v2}>,輸出鍵值對(duì)<k3,v3>。
二、MapReduce原理
三、Map任務(wù)處理
1、讀取輸入文件內(nèi)容,解析成key、value對(duì)。對(duì)輸入文件的每一行,解析成 key、value對(duì)。每一個(gè)鍵值對(duì)調(diào)用一次map函數(shù)。
2 、寫自己的邏輯,處理輸入的key、value,轉(zhuǎn)換成新的key、value輸出。
3 、對(duì)輸出的key、value進(jìn)行分區(qū)。
4 、對(duì)不同分區(qū)的數(shù)據(jù),按照key進(jìn)行排序、分組。相同key的value放到一個(gè)集合中。
5? 、 (可選)分組后的數(shù)據(jù)進(jìn)行歸約。
四、Reduce任務(wù)處理
1、對(duì)多個(gè)map任務(wù)的輸出,按照不同的分區(qū),通過網(wǎng)絡(luò)copy到不同的reduce節(jié)點(diǎn)。
2 、對(duì)多個(gè)map任務(wù)的輸出進(jìn)行合并、排序。寫reduce函數(shù)自己的邏輯,對(duì)輸入的key、value處理,轉(zhuǎn)換成新的key、value輸出。
3 、把reduce的輸出保存到HDFS文件中。
五、Map任務(wù)和Reduce任務(wù)舉例
假如我們要做一個(gè)詞頻統(tǒng)計(jì)的任務(wù),在HDFS中的words文件內(nèi)容
YSL 17
紀(jì)梵希 303
香奈兒 46
YSL 12
YSL 14
Map輸入這一步由MapReduce框架自動(dòng)完成,
Reduce輸入這一步由MapReduce框架自動(dòng)完成,
六、MapReduce流程分析
1、過程各個(gè)角色的作用
jobClient:提交作業(yè)
JobTracker:初始化作業(yè),分配作業(yè),TaskTracker與其進(jìn)行通信,協(xié)調(diào)監(jiān)控整個(gè)作業(yè)
TaskTracker:定期與JobTracker通信,執(zhí)行Map和Reduce任務(wù)
HDFS:保存作業(yè)的數(shù)據(jù)、配置、jar包、結(jié)果
2、作業(yè)提交流程
(1)提交作業(yè)準(zhǔn)備:編寫自己的MR程序; 配置作業(yè),包括輸入輸出路徑等等。
(2)提交作業(yè):配置完成后,通過JobClient提交。
(3)具體功能:與JobTracker通信得到一個(gè)jar的存儲(chǔ)路徑和JobId,輸入輸出路徑檢查、將jobj ar拷貝到的HDFS。
3、作業(yè)初始化
客戶端提交作業(yè)后,JobTracker會(huì)將作業(yè)加入到隊(duì)列,然后進(jìn)行調(diào)度,默認(rèn)是FIFO方式。
具體功能:作業(yè)初始化主要是指JobInProgress中完成的。
讀取分片信息。創(chuàng)建task包括Map和Reduce任創(chuàng)建task包括Map和Reduce任務(wù)。
創(chuàng)建TaskInProgress執(zhí)行task,包括map任務(wù)和reduce任務(wù)。
4、任務(wù)分配
TaskTracker與JobTracker之間的通信和任務(wù)分配是通過心跳機(jī)制實(shí)現(xiàn)的
TaskTracker會(huì)主動(dòng)定期向JobTracker發(fā)送報(bào)告,詢問是否有任務(wù)要做,如果有,就會(huì)申請(qǐng)到任務(wù)。
5、任務(wù)執(zhí)行
如果TaskTracker拿到任務(wù),會(huì)將所有信息拷貝到本地,包括代碼、配置、分片信息等。
TaskTracker中的localizeJob()方法會(huì)被調(diào)用進(jìn)行本地化,拷貝job.jar,jobconf,job.xml到本地。
TaskTracker調(diào)用launchTaskForJob()方法加載啟動(dòng)任務(wù)。
MapTaskRunner和ReduceTaskRunner分別啟動(dòng)java child進(jìn)程來執(zhí)行相應(yīng)的任務(wù)。
6、錯(cuò)誤處理
a、JobTracker失敗
存在單點(diǎn)故障,hadoop2.0解決了這個(gè)問題
b、TraskTracker失敗
TraskTracker崩潰了會(huì)停止向JobTracker發(fā)送心跳信息。
JobTracker會(huì)將TraskTracker從等待的任務(wù)池中移除,并將該任務(wù)轉(zhuǎn)移到其他的地方執(zhí)行
JobTracker將TaskTracker加入到黑名單中
c、Task失敗
任務(wù)失敗,會(huì)向TraskTracker拋出異常,最后任務(wù)掛起