一、概述
MapReduce是一種分布式計算模型妓笙,由兩個階段組成:Map和Reduce宰衙,用戶只需要實現(xiàn)map()和reduce()兩個函數(shù),即可實現(xiàn)分布式計算闯估。
這兩個函數(shù)的形參是key灼舍、value對,表示函數(shù)的輸入信息涨薪。
其中map()骑素,輸入鍵值對<k1,v1>,輸出鍵值對<k2,v2>;
reduce()刚夺,輸入鍵值對<k2,{v2}>,輸出鍵值對<k3,v3>献丑。
二末捣、MapReduce原理
三、Map任務(wù)處理
1创橄、讀取輸入文件內(nèi)容箩做,解析成key、value對妥畏。對輸入文件的每一行邦邦,解析成 key、value對醉蚁。每一個鍵值對調(diào)用一次map函數(shù)燃辖。
2 、寫自己的邏輯网棍,處理輸入的key黔龟、value,轉(zhuǎn)換成新的key确沸、value輸出捌锭。
3 、對輸出的key罗捎、value進行分區(qū)观谦。
4 、對不同分區(qū)的數(shù)據(jù)桨菜,按照key進行排序豁状、分組。相同key的value放到一個集合中倒得。
5? 泻红、 (可選)分組后的數(shù)據(jù)進行歸約。
四霞掺、Reduce任務(wù)處理
1谊路、對多個map任務(wù)的輸出,按照不同的分區(qū)菩彬,通過網(wǎng)絡(luò)copy到不同的reduce節(jié)點缠劝。
2 、對多個map任務(wù)的輸出進行合并骗灶、排序惨恭。寫reduce函數(shù)自己的邏輯,對輸入的key耙旦、value處理脱羡,轉(zhuǎn)換成新的key、value輸出。
3 锉罐、把reduce的輸出保存到HDFS文件中帆竹。
五、Map任務(wù)和Reduce任務(wù)舉例
假如我們要做一個詞頻統(tǒng)計的任務(wù)氓鄙,在HDFS中的words文件內(nèi)容
YSL 17
紀梵希 303
香奈兒 46
YSL 12
YSL 14
Map輸入這一步由MapReduce框架自動完成馆揉,
Reduce輸入這一步由MapReduce框架自動完成,
六抖拦、MapReduce流程分析
1升酣、過程各個角色的作用
jobClient:提交作業(yè)
JobTracker:初始化作業(yè),分配作業(yè)态罪,TaskTracker與其進行通信噩茄,協(xié)調(diào)監(jiān)控整個作業(yè)
TaskTracker:定期與JobTracker通信,執(zhí)行Map和Reduce任務(wù)
HDFS:保存作業(yè)的數(shù)據(jù)复颈、配置绩聘、jar包、結(jié)果
2耗啦、作業(yè)提交流程
(1)提交作業(yè)準備:編寫自己的MR程序凿菩; 配置作業(yè),包括輸入輸出路徑等等帜讲。
(2)提交作業(yè):配置完成后衅谷,通過JobClient提交。
(3)具體功能:與JobTracker通信得到一個jar的存儲路徑和JobId,輸入輸出路徑檢查似将、將jobj ar拷貝到的HDFS获黔。
3、作業(yè)初始化
客戶端提交作業(yè)后在验,JobTracker會將作業(yè)加入到隊列玷氏,然后進行調(diào)度,默認是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ù)分配是通過心跳機制實現(xiàn)的
TaskTracker會主動定期向JobTracker發(fā)送報告,詢問是否有任務(wù)要做膘怕,如果有想诅,就會申請到任務(wù)。
5、任務(wù)執(zhí)行
如果TaskTracker拿到任務(wù)来破,會將所有信息拷貝到本地篮灼,包括代碼、配置徘禁、分片信息等诅诱。
TaskTracker中的localizeJob()方法會被調(diào)用進行本地化,拷貝job.jar送朱,jobconf娘荡,job.xml到本地。
TaskTracker調(diào)用launchTaskForJob()方法加載啟動任務(wù)驶沼。
MapTaskRunner和ReduceTaskRunner分別啟動java child進程來執(zhí)行相應(yīng)的任務(wù)炮沐。
6、錯誤處理
a回怜、JobTracker失敗
存在單點故障大年,hadoop2.0解決了這個問題
b、TraskTracker失敗
TraskTracker崩潰了會停止向JobTracker發(fā)送心跳信息玉雾。
JobTracker會將TraskTracker從等待的任務(wù)池中移除翔试,并將該任務(wù)轉(zhuǎn)移到其他的地方執(zhí)行
JobTracker將TaskTracker加入到黑名單中
c、Task失敗
任務(wù)失敗垦缅,會向TraskTracker拋出異常,最后任務(wù)掛起