了解MapReduce

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ī)制:

image.png

作業(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è)工作流程圖

image.png

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ī)制

image.png

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>鍵值對類型的存在

image.png

Mapreduce作業(yè)的處理流程【important】

image.png

輸入分片(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ù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • MapReduce框架結(jié)構(gòu)## MapReduce是一個用于大規(guī)模數(shù)據(jù)處理的分布式計算模型MapReduce模型主...
    Bloo_m閱讀 3,799評論 0 4
  • 思考問題 MapReduce總結(jié) MapReduce MapReduce的定義MapReduce是一種編程模型, ...
    Sakura_P閱讀 959評論 0 1
  • 目的這篇教程從用戶的角度出發(fā),全面地介紹了Hadoop Map/Reduce框架的各個方面。先決條件請先確認(rèn)Had...
    SeanC52111閱讀 1,767評論 0 1
  • 這一篇文章記錄一下hadoop中的分布式運算MapReduce的過程,作為《深入理解大數(shù)據(jù)》的學(xué)習(xí)筆記。 上一篇看...
    七號蘿卜閱讀 2,155評論 0 7
  • 07/3/2017《超級個體》吾愛廬 知識概述 一、職業(yè)2種策略 1、資源策略:已有能力資源來做好手邊的事,能做什...
    吾愛廬閱讀 242評論 0 0