MapReduce是面向大數(shù)據(jù)并行處理的計算模型、框架和平臺。MapReduce是一個基于集群的高性能并行計算平臺(Cluster Infrastructure)。MapReduce是一個并行計算與運行軟件框架,很多系統(tǒng)底層的復(fù)雜細(xì)節(jié)交由系統(tǒng)負(fù)責(zé)處理,大大減少了軟件開發(fā)人員的負(fù)擔(dān)。【自動完成計算任務(wù)的并行化處理,自動劃分計算數(shù)據(jù)和計算任務(wù),在集群節(jié)點上自動分配和執(zhí)行任務(wù)以及收集計算結(jié)果】MapReduce是一個并行程序設(shè)計模型與方法(Programming Model & Methodology)。用Map和Reduce兩個函數(shù)編程實現(xiàn)基本的并行計算任務(wù),提供了抽象的操作和并行編程接口,以簡單方便地完成大規(guī)模數(shù)據(jù)的編程和計算處理。
Mapreduce的特點:
軟件框架
并行處理
可靠且容錯
大規(guī)模集群
海量數(shù)據(jù)集
MapReduce的思想就是“分而治之”
MapReduce工作機(jī)制:
作業(yè)執(zhí)行涉及4個獨立的實體(對象)
客戶端(client):編寫mapreduce程序,配置作業(yè),提交作業(yè),這就是程序員完成的
工作;
JobTracker:初始化作業(yè),分配作業(yè),與TaskTracker通信,協(xié)調(diào)整個作業(yè)的執(zhí)行;
TaskTracker:保持與JobTracker的通信,在分配的數(shù)據(jù)片段上執(zhí)行Map或Reduce任務(wù),
TaskTracker和JobTracker的不同有個很重要的方面,就是在執(zhí)行任務(wù)時候TaskTracker可以
有n多個,JobTracker則只會有一個(JobTracker只能有一個就和hdfs里namenode一樣存在
單點故障)
Hdfs:保存作業(yè)的數(shù)據(jù)、配置信息等等,最后的結(jié)果也是保存在hdfs上面
作業(yè)工作流程圖
mapreduce運行步驟:
1.客戶端要編寫好mapreduce程序,配置好mapreduce的作業(yè)也就是job
2.提交job了,提交job是提交到JobTracker上的,這個時候JobTracker就會構(gòu)建這個job,具體就是分配一個新的job任務(wù)的ID值
3.JobTracker做檢查操作,檢查確定輸出目錄是否存在,檢查輸入目錄是否存在,如果不存在那么job就不能正常運行下去,JobTracker會拋出錯誤給客戶端,
4.如果存在JobTracker會根據(jù)輸入計算輸入分片(Input Split),如果分片計算不出來也會拋出錯誤,這些都做好了JobTracker就會配置Job需要的資源了。
5.分配好資源后,JobTracker就會初始化作業(yè),初始化主要做的是將Job放入一個內(nèi)部的隊列,讓配置好的作業(yè)調(diào)度器能調(diào)度到這個作業(yè),作業(yè)調(diào)度器會初始化這個job,初始化就是創(chuàng)建一個正在運行的job對象(封裝任務(wù)和記錄信息),以便JobTracker跟蹤job的狀態(tài)和進(jìn)程。
6.初始化完畢后,作業(yè)調(diào)度器會獲取輸入分片信息(input split),每個分片創(chuàng)建一個map任務(wù)。
7.任務(wù)分配,這個時候tasktracker會運行一個簡單的循環(huán)機(jī)制定期發(fā)送心跳給jobtracker,心跳間隔是5秒,程序員可以配置這個時間,心跳就是jobtracker和tasktracker溝通的橋梁,通過心跳,jobtracker可以監(jiān)控tasktracker是否存活,也可以獲取tasktracker處理的狀態(tài)和問題,同時tasktracker也可以通過心跳里的返回值獲取jobtracker給它的操作指令。
8.任務(wù)分配好后就是執(zhí)行任務(wù)了。在任務(wù)執(zhí)行時候jobtracker可以通過心跳機(jī)制監(jiān)控tasktracker的狀態(tài)和進(jìn)度,同時也能計算出整個job的狀態(tài)和進(jìn)度,而tasktracker也可以本地監(jiān)控自己的狀態(tài)和進(jìn)度。
9.當(dāng)jobtracker獲得了最后一個完成指定任務(wù)的tasktracker操作成功的通知時候,jobtracker會把整個job狀態(tài)置為成功.
10.然后當(dāng)客戶端查詢job運行狀態(tài)時候(注意:這個是異步操作),客戶端會查到j(luò)ob完成的通知的。如果job中途失敗,mapreduce也會有相應(yīng)機(jī)制處理,一般而言如果不是程序員程序本身有bug,mapreduce錯誤處理機(jī)制都能保證提交的job能正常完成。
mapreduce運行機(jī)制
1.在Hadoop中,一個MapReduce作業(yè)會把輸入的數(shù)據(jù)集切分為若干獨立的數(shù)據(jù)塊,由Map任務(wù)以完全并行的方式處理
2.框架會對Map的輸出先進(jìn)行排序,然后把結(jié)果輸入給Reduce任務(wù)。
3.作業(yè)的輸入和輸出都會被存儲在文件系統(tǒng)中,整個框架負(fù)責(zé)任務(wù)的調(diào)度和監(jiān)控,以及重新執(zhí)行已經(jīng)關(guān)閉的任務(wù)
4.MapReduce框架和分布式文件系統(tǒng)是運行在一組相同的節(jié)點,計算節(jié)點和存儲節(jié)點都是在一起的
一個MapReduce作業(yè)的輸入和輸出類型:會有三組<key,value>鍵值對類型的存在
Mapreduce作業(yè)的處理流程【important】
輸入分片(input split):在進(jìn)行map計算之前,mapreduce會根據(jù)輸入文件計算輸入分片(input split),每個輸入分片(input split)針對一個map任務(wù)。輸入分片(input split)存儲的并非數(shù)據(jù)本身,而是一個分片長度和一個記錄數(shù)據(jù)的位置的數(shù)組,輸入分片(input split)往往和hdfs的block(塊)關(guān)系很密切。
假如我們設(shè)定hdfs的塊的大小是64mb,如果我們輸入有三個文件,大小分別是3mb、65mb和127mb,那么mapreduce會把3mb文件分為一個輸入分片(input split),65mb則是兩個輸入分片(input split)而127mb也是兩個輸入分片(input split)即我們?nèi)绻趍ap計算前做輸入分片調(diào)整,例如合并小文件,那么就會有5個map任務(wù)將執(zhí)行,而且每個map執(zhí)行的數(shù)據(jù)大小不均,這個也是mapreduce優(yōu)化計算的一個關(guān)鍵點。
map階段:程序員編寫好的map函數(shù)了,因此map函數(shù)效率相對好控制,而且一般map操作都是本地化操作也就是在數(shù)據(jù)存儲節(jié)點上進(jìn)行。
combiner階段:
combiner階段是程序員可以選擇的,combiner其實也是一種reduce操作,因此我們看見WordCount類里是用reduce進(jìn)行加載的。
Combiner是一個本地化的reduce操作,它是map運算的后續(xù)操作,主要是在map計算出中間文件前做一個簡單的合并重復(fù)key值的操作,例如我們對文件里的單詞頻率做統(tǒng)計,map計算時候如果碰到一個hadoop的單詞就會記錄為1,但是這篇文章里hadoop可能會出現(xiàn)n多次,那么map輸出文件冗余就會很多,因此在reduce計算前對相同的key做一個合并操作,那么文件會變小,這樣就提高了寬帶的傳輸效率,畢竟hadoop計算力寬帶資源往往是計算的瓶頸也是最為寶貴的資源,但是combiner操作是有風(fēng)險的,使用它的原則是combiner的輸入不會影響到reduce計算的最終輸入,例如:如果計算只是求總數(shù),最大值,最小值可以使用combiner,但是做平均值計算使用combiner的話,最終的reduce計算結(jié)果就會出錯。
shuffle階段:將map的輸出作為reduce的輸入的過程就是shuffle了
reduce階段:和map函數(shù)一樣也是程序員編寫的,最終結(jié)果是存儲在hdfs上的。
單點故障
jobtracker和hdfs的namenode一樣也存在單點故障,
單點故障一直是hadoop被人詬病的大問題,
為什么hadoop的做的文件系統(tǒng)和mapreduce計算框架都是高容錯的,但是最重要的管理節(jié)點的故障機(jī)制卻如此不好,我認(rèn)為主要是namenode和jobtracker在實際運行中都是在內(nèi)存操作,而做到內(nèi)存的容錯就比較復(fù)雜了,只有當(dāng)內(nèi)存數(shù)據(jù)被持久化后容錯才好做,namenode和jobtracker都可以備份自己持久化的文件,但是這個持久化都會有延遲,因此真的出故障,任然不能整體恢復(fù),另外hadoop框架里包含zookeeper框架,zookeeper可以結(jié)合jobtracker,用幾臺機(jī)器同時部署jobtracker,保證一臺出故障,有一臺馬上能補(bǔ)充上,不過這種方式也沒法恢復(fù)正在跑的mapreduce任務(wù)。