Hadoop阅读笔记(四)——一幅图看透MapReduce机制
時(shí)至今日,已然看到第十章,似乎越是焦躁什么時(shí)候能翻完這本圣經(jīng)的時(shí)候也讓自己變得更加浮躁,想想后面還有一半的行程沒(méi)走,我覺(jué)得這樣“有口無(wú)心”的學(xué)習(xí)方式是不奏效的,或者是收效甚微的。如果有幸能有大牛路過(guò),請(qǐng)指教如何能以效率較高的方式學(xué)習(xí)Hadoop。
我已經(jīng)記不清圣經(jīng)《hadoop 實(shí)戰(zhàn)2》在我手中停留了多久,但是每一頁(yè)每一章的翻過(guò)去,還是在腦殼里留下了點(diǎn)什么。
一段時(shí)間以來(lái),我還是通過(guò)這本書(shū)加深以及糾正了我對(duì)于MapReduce、HDFS乃至Hadoop的新的認(rèn)識(shí)。本篇主要介紹MapReduce作業(yè)的工作機(jī)制,并介紹介于Map和Reduce過(guò)程中的Shuffle和排序過(guò)程。
為響應(yīng)標(biāo)題,我們今天談的MapReduce機(jī)制,切入點(diǎn)是一張圖。先上圖:
從圖中不難看出,整個(gè)MapReduce分為以下流程:代碼編寫(xiě)->作業(yè)配置->作業(yè)提交->Map任務(wù)的分配和執(zhí)行->處理中間結(jié)果->Reduce任務(wù)的分配和執(zhí)行->作業(yè)完成
圖中:
1.運(yùn)行作業(yè)
2.獲取作業(yè)ID
3.復(fù)制作業(yè)資源
4.提交作業(yè)
5.初始化作業(yè)
6.獲取輸入分割
7.心跳通信
8.獲取作業(yè)資源
9.發(fā)布
10.運(yùn)行
以上過(guò)程主要涉及到的實(shí)體有客戶(hù)端(用于MR代碼的編寫(xiě),配置作業(yè),提交作業(yè));TaskTracker(保持與JobTracker通信,在分配的數(shù)據(jù)片段上執(zhí)行Map或Reduce任務(wù));HDFS(保存作業(yè)的數(shù)據(jù)、配置信息、作業(yè)結(jié)果等);JobTracker(初始化作業(yè),分配作業(yè),與TaskTracker通信,協(xié)調(diào)整個(gè)作業(yè)的執(zhí)行)
?
提交作業(yè)
在提交作業(yè)前,我們需要對(duì)作業(yè)進(jìn)行配置,主要包括:
(1)程序代碼
(2)Map和Reduce接口
(3)輸入輸出路徑
(4)其他配置,如InputFormat、OutputFormat等
?
提交作業(yè)的過(guò)程可以分為以下幾步:
(1)調(diào)用JobTracker對(duì)象的getNewJobId()方法從JobTracker處獲取當(dāng)前作業(yè)的ID(見(jiàn)途中步驟2)
(2)檢查作業(yè)相關(guān)路徑,在運(yùn)行代碼時(shí),經(jīng)常遇到報(bào)錯(cuò)提示輸出目錄已存在,所以在運(yùn)行代碼前要確保輸出目錄不存在
(3)計(jì)算作業(yè)的輸入劃分
(4)將運(yùn)行所需資源(如jar文件、配置文件、計(jì)算所得輸入劃分等)復(fù)制到作業(yè)對(duì)于的HDFS上(見(jiàn)步驟3)
(5)調(diào)用JobTracker對(duì)象的submitJob()方法來(lái)真正提交作業(yè),通知JobTracker作業(yè)準(zhǔn)備執(zhí)行(見(jiàn)步驟4)
?
初始化作業(yè)
JobTracker在客戶(hù)端調(diào)用其submitJob()方法后,會(huì)將此調(diào)用放入內(nèi)部的TaskScheduler變量中,進(jìn)行調(diào)度,默認(rèn)調(diào)度方法為:JobQueueTaskScheduler即FIFO調(diào)度方式。
初始化作業(yè)分為如下幾個(gè)步驟:
(1)從HDFS中讀取作業(yè)對(duì)應(yīng)的job.split(見(jiàn)步驟6),JobTracker從HDFS中作業(yè)對(duì)應(yīng)的路徑獲取JobClient在步驟3中寫(xiě)入的job.split文件,得到輸入數(shù)據(jù)的劃分信息,為后面初始化過(guò)程中Map任務(wù)的分配做好準(zhǔn)備。
(2)創(chuàng)建并初始化Map任務(wù)和Reduce任務(wù)。
(3)創(chuàng)建兩個(gè)初始化Task,根據(jù)個(gè)數(shù)和輸入劃分已經(jīng)配置的信息,并分別初始化Map和Reduce。
?
分配任務(wù):
TaskTracker和JobTracker之間的通信和任務(wù)分配都是通過(guò)心跳機(jī)制完成的。TaskTracker會(huì)以一定間隔時(shí)間向JobTracker發(fā)送心跳,告訴自己是否存活,準(zhǔn)備執(zhí)行新任務(wù);而JobTracker在接收到心跳信息后會(huì)查看是否有待分配任務(wù),如果有,則會(huì)分配給TaskTracker。
?
執(zhí)行任務(wù):
當(dāng)TaskTracker接收到新任務(wù)時(shí)就要開(kāi)始運(yùn)行任務(wù),第一步就是將任務(wù)本地化,將任務(wù)所需的數(shù)據(jù)、配置信息、程序代碼從HDFS復(fù)制到TaskTracker本地(將步驟8)。該過(guò)程主要通過(guò)localizeJob()方法來(lái)實(shí)現(xiàn)任務(wù)的本地化,具體包括以下幾個(gè)步驟:
(1)將job.split復(fù)制到本地
(2)將job.jar復(fù)制到本地
(3)將job的配置信息寫(xiě)入job.xml
(4)創(chuàng)建本地任務(wù)目錄,解壓job.jar
(5)調(diào)用launchTaskForJob()方法發(fā)布任務(wù)(見(jiàn)步驟9)
?
更新任務(wù)執(zhí)行進(jìn)度和狀態(tài):
由MapReduce作業(yè)分割成的每個(gè)任務(wù)中都有一組計(jì)數(shù)器,他們對(duì)任務(wù)執(zhí)行過(guò)程中的進(jìn)度組成事件進(jìn)行計(jì)數(shù)。如果任務(wù)要報(bào)告進(jìn)度,它便會(huì)設(shè)置一個(gè)標(biāo)志以表明狀態(tài)變化將會(huì)發(fā)送到TaskTracker上,另一個(gè)監(jiān)聽(tīng)線程檢查到這標(biāo)志后,會(huì)告知TaskTracker當(dāng)前的任務(wù)狀態(tài)。
?
完成作業(yè):
所有TaskTracker任務(wù)的執(zhí)行進(jìn)度信息都匯總到JobTracker處,當(dāng)JobTracker接收到最后一個(gè)任務(wù)的已完成通知后,便把作業(yè)的狀態(tài)設(shè)置為“成功”。
?
Shuffle和排序:
在Map和Reduce之間有一個(gè)叫做Shuffle的過(guò)程,主要的工作是將Map的輸出結(jié)果進(jìn)行一定的排序和分割再交給Reduce,從某種程度上說(shuō),Shuffle過(guò)程的性能與整個(gè)MapReduce的性能直接相關(guān)。
Shuffle過(guò)程分為Map和Reduce端。Map端的Shuffle過(guò)程是對(duì)Map的結(jié)果進(jìn)行劃分(partition)、排序(sort)和分割(spill),然后將屬于同一個(gè)劃分的輸出合并在一起(merge)并寫(xiě)在磁盤(pán)上,同時(shí)按照不同的劃分將結(jié)果發(fā)送給對(duì)應(yīng)的Reduce(Map輸出的劃分與Reduce的對(duì)應(yīng)關(guān)系由JobTracker確定)。
Reduce端又會(huì)將各個(gè)Map送來(lái)的屬于同一個(gè)劃分的輸出進(jìn)行合并(merge),然后對(duì)merge的結(jié)果進(jìn)行排序,最后交給Reduce處理。
對(duì)于Hadoop等大數(shù)據(jù)技術(shù)有興趣的歡迎加群413471695交流討論^_^
本文鏈接:《Hadoop閱讀筆記(四)——一幅圖看透MapReduce機(jī)制》
?
友情贊助
如果你覺(jué)得博主的文章對(duì)你那么一點(diǎn)小幫助,恰巧你又有想打賞博主的小沖動(dòng),那么事不宜遲,趕緊掃一掃,小額地贊助下,攢個(gè)奶粉錢(qián),也是讓博主有動(dòng)力繼續(xù)努力,寫(xiě)出更好的文章^^。
1. 支付寶 2. 微信
轉(zhuǎn)載于:https://www.cnblogs.com/bigdataZJ/p/hadoopreading4.html
總結(jié)
以上是生活随笔為你收集整理的Hadoop阅读笔记(四)——一幅图看透MapReduce机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LocalReport Print wi
- 下一篇: android实现类似于支付宝余额快速闪