MapReduce是面向大數(shù)據(jù)并行處理的計(jì)算模型、框架和平臺(tái)惕稻。MapReduce是一個(gè)基于集群的高性能并行計(jì)算平臺(tái)(Cluster Infrastructure)竖共。MapReduce是一個(gè)并行計(jì)算與運(yùn)行軟件框架,很多系統(tǒng)底層的復(fù)雜細(xì)節(jié)交由系統(tǒng)負(fù)責(zé)處理俺祠,大大減少了軟件開(kāi)發(fā)人員的負(fù)擔(dān)公给〗枇保【自動(dòng)完成計(jì)算任務(wù)的并行化處理,自動(dòng)劃分計(jì)算數(shù)據(jù)和計(jì)算任務(wù)淌铐,在集群節(jié)點(diǎn)上自動(dòng)分配和執(zhí)行任務(wù)以及收集計(jì)算結(jié)果】MapReduce是一個(gè)并行程序設(shè)計(jì)模型與方法(Programming Model & Methodology)姻蚓。用Map和Reduce兩個(gè)函數(shù)編程實(shí)現(xiàn)基本的并行計(jì)算任務(wù),提供了抽象的操作和并行編程接口匣沼,以簡(jiǎn)單方便地完成大規(guī)模數(shù)據(jù)的編程和計(jì)算處理。
Mapreduce的特點(diǎn):
軟件框架
并行處理
可靠且容錯(cuò)
大規(guī)模集群
海量數(shù)據(jù)集
MapReduce的思想就是“分而治之”
MapReduce工作機(jī)制:
作業(yè)執(zhí)行涉及4個(gè)獨(dú)立的實(shí)體(對(duì)象)
客戶端(client):編寫(xiě)mapreduce程序捂龄,配置作業(yè)释涛,提交作業(yè),這就是程序員完成的
工作倦沧;
JobTracker:初始化作業(yè)唇撬,分配作業(yè),與TaskTracker通信展融,協(xié)調(diào)整個(gè)作業(yè)的執(zhí)行窖认;
TaskTracker:保持與JobTracker的通信,在分配的數(shù)據(jù)片段上執(zhí)行Map或Reduce任務(wù)告希,
TaskTracker和JobTracker的不同有個(gè)很重要的方面扑浸,就是在執(zhí)行任務(wù)時(shí)候TaskTracker可以
有n多個(gè),JobTracker則只會(huì)有一個(gè)(JobTracker只能有一個(gè)就和hdfs里namenode一樣存在
單點(diǎn)故障)
Hdfs:保存作業(yè)的數(shù)據(jù)燕偶、配置信息等等喝噪,最后的結(jié)果也是保存在hdfs上面
作業(yè)工作流程圖
mapreduce運(yùn)行步驟:
1.客戶端要編寫(xiě)好mapreduce程序,配置好mapreduce的作業(yè)也就是job
2.提交job了指么,提交job是提交到JobTracker上的酝惧,這個(gè)時(shí)候JobTracker就會(huì)構(gòu)建這個(gè)job,具體就是分配一個(gè)新的job任務(wù)的ID值
3.JobTracker做檢查操作伯诬,檢查確定輸出目錄是否存在晚唇,檢查輸入目錄是否存在,如果不存在那么job就不能正常運(yùn)行下去,JobTracker會(huì)拋出錯(cuò)誤給客戶端盗似,
4.如果存在JobTracker會(huì)根據(jù)輸入計(jì)算輸入分片(Input Split)哩陕,如果分片計(jì)算不出來(lái)也會(huì)拋出錯(cuò)誤,這些都做好了JobTracker就會(huì)配置Job需要的資源了赫舒。
5.分配好資源后萌踱,JobTracker就會(huì)初始化作業(yè),初始化主要做的是將Job放入一個(gè)內(nèi)部的隊(duì)列号阿,讓配置好的作業(yè)調(diào)度器能調(diào)度到這個(gè)作業(yè)并鸵,作業(yè)調(diào)度器會(huì)初始化這個(gè)job,初始化就是創(chuàng)建一個(gè)正在運(yùn)行的job對(duì)象(封裝任務(wù)和記錄信息)扔涧,以便JobTracker跟蹤job的狀態(tài)和進(jìn)程园担。
6.初始化完畢后届谈,作業(yè)調(diào)度器會(huì)獲取輸入分片信息(input split),每個(gè)分片創(chuàng)建一個(gè)map任務(wù)弯汰。
7.任務(wù)分配艰山,這個(gè)時(shí)候tasktracker會(huì)運(yùn)行一個(gè)簡(jiǎn)單的循環(huán)機(jī)制定期發(fā)送心跳給jobtracker,心跳間隔是5秒咏闪,程序員可以配置這個(gè)時(shí)間曙搬,心跳就是jobtracker和tasktracker溝通的橋梁,通過(guò)心跳鸽嫂,jobtracker可以監(jiān)控tasktracker是否存活纵装,也可以獲取tasktracker處理的狀態(tài)和問(wèn)題,同時(shí)tasktracker也可以通過(guò)心跳里的返回值獲取jobtracker給它的操作指令据某。
8.任務(wù)分配好后就是執(zhí)行任務(wù)了橡娄。在任務(wù)執(zhí)行時(shí)候jobtracker可以通過(guò)心跳機(jī)制監(jiān)控tasktracker的狀態(tài)和進(jìn)度,同時(shí)也能計(jì)算出整個(gè)job的狀態(tài)和進(jìn)度癣籽,而tasktracker也可以本地監(jiān)控自己的狀態(tài)和進(jìn)度挽唉。
9.當(dāng)jobtracker獲得了最后一個(gè)完成指定任務(wù)的tasktracker操作成功的通知時(shí)候,jobtracker會(huì)把整個(gè)job狀態(tài)置為成功.
10.然后當(dāng)客戶端查詢job運(yùn)行狀態(tài)時(shí)候(注意:這個(gè)是異步操作)筷狼,客戶端會(huì)查到j(luò)ob完成的通知的瓶籽。如果job中途失敗,mapreduce也會(huì)有相應(yīng)機(jī)制處理埂材,一般而言如果不是程序員程序本身有bug栖疑,mapreduce錯(cuò)誤處理機(jī)制都能保證提交的job能正常完成垦沉。
mapreduce運(yùn)行機(jī)制
1.在Hadoop中,一個(gè)MapReduce作業(yè)會(huì)把輸入的數(shù)據(jù)集切分為若干獨(dú)立的數(shù)據(jù)塊,由Map任務(wù)以完全并行的方式處理
2.框架會(huì)對(duì)Map的輸出先進(jìn)行排序皮服,然后把結(jié)果輸入給Reduce任務(wù)褒脯。
3.作業(yè)的輸入和輸出都會(huì)被存儲(chǔ)在文件系統(tǒng)中拯田,整個(gè)框架負(fù)責(zé)任務(wù)的調(diào)度和監(jiān)控绷杜,以及重新執(zhí)行已經(jīng)關(guān)閉的任務(wù)
4.MapReduce框架和分布式文件系統(tǒng)是運(yùn)行在一組相同的節(jié)點(diǎn),計(jì)算節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)都是在一起的
一個(gè)MapReduce作業(yè)的輸入和輸出類型:會(huì)有三組<key,value>鍵值對(duì)類型的存在
Mapreduce作業(yè)的處理流程【important】
輸入分片(input split):在進(jìn)行map計(jì)算之前预鬓,mapreduce會(huì)根據(jù)輸入文件計(jì)算輸入分片(input split)巧骚,每個(gè)輸入分片(input split)針對(duì)一個(gè)map任務(wù)。輸入分片(input split)存儲(chǔ)的并非數(shù)據(jù)本身格二,而是一個(gè)分片長(zhǎng)度和一個(gè)記錄數(shù)據(jù)的位置的數(shù)組劈彪,輸入分片(input split)往往和hdfs的block(塊)關(guān)系很密切。
假如我們?cè)O(shè)定hdfs的塊的大小是64mb顶猜,如果我們輸入有三個(gè)文件沧奴,大小分別是3mb、65mb和127mb长窄,那么mapreduce會(huì)把3mb文件分為一個(gè)輸入分片(input split)滔吠,65mb則是兩個(gè)輸入分片(input split)而127mb也是兩個(gè)輸入分片(input split)即我們?nèi)绻趍ap計(jì)算前做輸入分片調(diào)整纲菌,例如合并小文件,那么就會(huì)有5個(gè)map任務(wù)將執(zhí)行疮绷,而且每個(gè)map執(zhí)行的數(shù)據(jù)大小不均翰舌,這個(gè)也是mapreduce優(yōu)化計(jì)算的一個(gè)關(guān)鍵點(diǎn)。
map階段:程序員編寫(xiě)好的map函數(shù)了冬骚,因此map函數(shù)效率相對(duì)好控制椅贱,而且一般map操作都是本地化操作也就是在數(shù)據(jù)存儲(chǔ)節(jié)點(diǎn)上進(jìn)行。
combiner階段:
combiner階段是程序員可以選擇的只冻,combiner其實(shí)也是一種reduce操作庇麦,因此我們看見(jiàn)WordCount類里是用reduce進(jìn)行加載的。
Combiner是一個(gè)本地化的reduce操作属愤,它是map運(yùn)算的后續(xù)操作,主要是在map計(jì)算出中間文件前做一個(gè)簡(jiǎn)單的合并重復(fù)key值的操作酸役,例如我們對(duì)文件里的單詞頻率做統(tǒng)計(jì)住诸,map計(jì)算時(shí)候如果碰到一個(gè)hadoop的單詞就會(huì)記錄為1,但是這篇文章里hadoop可能會(huì)出現(xiàn)n多次涣澡,那么map輸出文件冗余就會(huì)很多贱呐,因此在reduce計(jì)算前對(duì)相同的key做一個(gè)合并操作,那么文件會(huì)變小入桂,這樣就提高了寬帶的傳輸效率奄薇,畢竟hadoop計(jì)算力寬帶資源往往是計(jì)算的瓶頸也是最為寶貴的資源,但是combiner操作是有風(fēng)險(xiǎn)的抗愁,使用它的原則是combiner的輸入不會(huì)影響到reduce計(jì)算的最終輸入馁蒂,例如:如果計(jì)算只是求總數(shù),最大值蜘腌,最小值可以使用combiner沫屡,但是做平均值計(jì)算使用combiner的話,最終的reduce計(jì)算結(jié)果就會(huì)出錯(cuò)撮珠。
shuffle階段:將map的輸出作為reduce的輸入的過(guò)程就是shuffle了
reduce階段:和map函數(shù)一樣也是程序員編寫(xiě)的沮脖,最終結(jié)果是存儲(chǔ)在hdfs上的。
單點(diǎn)故障
jobtracker和hdfs的namenode一樣也存在單點(diǎn)故障芯急,
單點(diǎn)故障一直是hadoop被人詬病的大問(wèn)題勺届,
為什么hadoop的做的文件系統(tǒng)和mapreduce計(jì)算框架都是高容錯(cuò)的,但是最重要的管理節(jié)點(diǎn)的故障機(jī)制卻如此不好娶耍,我認(rèn)為主要是namenode和jobtracker在實(shí)際運(yùn)行中都是在內(nèi)存操作免姿,而做到內(nèi)存的容錯(cuò)就比較復(fù)雜了,只有當(dāng)內(nèi)存數(shù)據(jù)被持久化后容錯(cuò)才好做榕酒,namenode和jobtracker都可以備份自己持久化的文件养泡,但是這個(gè)持久化都會(huì)有延遲嗜湃,因此真的出故障,任然不能整體恢復(fù)澜掩,另外hadoop框架里包含zookeeper框架购披,zookeeper可以結(jié)合jobtracker,用幾臺(tái)機(jī)器同時(shí)部署jobtracker肩榕,保證一臺(tái)出故障刚陡,有一臺(tái)馬上能補(bǔ)充上,不過(guò)這種方式也沒(méi)法恢復(fù)正在跑的mapreduce任務(wù)株汉。