MapReduce原理簡介

MapReduce的起源&簡介

MapReduce("Map(映射)"和"Reduce(歸約))是一種編程模型,用於大規模數據集(大於1TB)的並行運算。它的核心思想來源於Google在2004年12月發表的一篇MapReduce論文:Our abstraction is inspired by the map and reduce primitives present in Lisp and many other functional languages。大致意思是,MapReduce的靈感來源於函數式語言(比如Lisp)中的內置函數map和reduce。

MapReduce是面向大數據並行處理的計算模型、框架和平臺,它隱含了以下三層含義:

1)MapReduce是一個基於集羣的高性能並行計算平臺(Cluster Infrastructure)。它允許用市場上普通的商用服務器構成一個包含數十、數百至數千個節點的分佈式和並行計算集羣。

2)MapReduce是一個並行計算與運行軟件框架(Software Framework)。它提供了一個龐大但設計精良的並行計算軟件框架,能自動完成計算任務的並行化處理,自動劃分計算數據和計算任務,在集羣節點上自動分配和執行任務以及收集計算結果,將數據分佈存儲、數據通信、容錯處理等並行計算涉及到的很多系統底層的複雜細節交由系統負責處理,大大減少了軟件開發人員的負擔。

3)MapReduce是一個並行程序設計模型與方法(Programming Model & Methodology)。它藉助於函數式程序設計語言Lisp的設計思想,提供了一種簡便的並行程序設計方法,用Map和Reduce兩個函數編程實現基本的並行計算任務,提供了抽象的操作和並行編程接口,以簡單方便地完成大規模數據的編程和計算處理。

MapReduce的特點

優點

  • 易於編程 MapReduce向用戶提供了簡單的編程接口,由框架層自動完成數據分佈存儲、數據通信、容錯處理等複雜的底層處理細節,用戶只需要使用接口實現自己的數據處理邏輯即可。
  • 良好的擴展性 允許用戶通過簡單的增加機器來擴展它的計算能力和吞吐能力。
  • 高容錯性 MapReduce設計的初衷就是使程序能夠部署在廉價的PC機器上,這就要求它具有很高的容錯性。比如其中一臺機器掛了,它可以把上面的計算任務轉移到另外一個節點上運行,不至於這個任務運行失敗,而且這個過程不需要人工參與,而完全是由 Hadoop內部完成的。
  • 適合PB級以上海量數據的離線處理。

缺點

MapReduce不擅長做實時計算、流式計算、DAG(有向圖)計算。

1)實時計算。MapReduce無法像Mysql一樣,在毫秒或者秒級內返回結果。

2)流式計算。流式計算的輸入數據是動態的,而MapReduce的輸入數據集需提前上傳到HDFS,是靜態的,不能動態變化。

3)DAG(有向圖)計算。多個應用程序存在依賴關係,後一個應用程序的輸入爲前一個的輸出。在這種情況下,MapReduce並不是不能做,而是使用後,每個MapReduce作業的輸出結果都會寫入到磁盤,會造成大量的磁盤IO,導致性能非常的低下。

MapReduce的典型應用場景----Wordcount:統計一大批文件中每個單詞出現的次數;

 類似的應用場景:

  • 簡單的數據統計,比如網站pv、 uv統計
  • 搜索引擎建索引
  • 海量數據查找
  • 複雜數據分析算法實現,聚類算法、分類算法、推薦算法、圖算法

MapReduce編程模型

MapReduce將作業的整個運行過程分爲兩個階段: Map(映射)階段和Reduce(歸約)階段。

Map階段由一定數量的Map Task組成,包含如下幾個步驟:

  • 輸入數據格式解析: InputFormat
  • 輸入數據處理: Mapper
  • 結果本地彙總:Combiner( local reducer)
  • 數據分組: Partitioner

Reduce階段由一定數量的Reduce Task組成,包含如下幾個步驟:

  • 數據遠程拷貝
  • 數據按照key排序
  • 數據處理: Reducer
  • 數據輸出格式: OutputFormat

以Wordcount爲例,MapReduce的內部執行過程如下圖所示。

 外部物理結構如下圖所示。

 InputFormat

InputFormat 負責對數據文件進行分片( InputSplit),並處理好跨行問題。它會將分片數據解析成key/value對,默認的實現是TextInputFormat 。TextInputFormat 的 Key是行在文件中的偏移量, value是行內容,若行被截斷,則讀取下一個block的前幾個字符。

Hadoop爲用戶提供瞭如下幾個InputFormat實現。

 Block VS Spit

Block

Split

HDFS中最小的數據存儲單位

MapReduce中最小的計算單元

默認是128MB

默認與Block一一對應,可用用戶自行控制

Combiner

Combiner可以看做是 local reducer,在Mapper計算完成後將相同的key對應的value進行合併( Wordcount例子),如下圖所示。

 Combiner通常與Reducer邏輯是一樣的,使用Combiner有如下好處:

  • 減少Map Task輸出數據量(磁盤IO)
  • 減少Reduce-Map網絡傳輸數據量(網絡IO)

需要注意的是,並不是所有的MapReduce場景都能夠使用Combiner,計算結果可以累加的場景一般可以使用,例如Sum,其他的例如求平均值 Average 則不能使用 Combiner。

Partitioner

Partitioner決定了Map Task輸出的每條數據交給哪個Reduce Task處理。默認實現是: hash(key) mod R ,其中 R是Reduce Task數目。

當然 Hadoop 也允許用戶自定義Partitioner,比如“ hash(hostname(URL)) mod R”確保相同域名的網頁交給同一個Reduce Task處理。

MapReduce的架構

MapReduce 1.0架構

MapReduce 1.0是一個Master-Slave架構。

JobTracker 是Master,通常只有一個,職責如下:

  • 管理所有作業
  • 將作業分解成一系列任務
  • 將任務指派給TaskTracker
  • 作業/任務監控、錯誤處理等

TaskTrackers 是 Slave,通常有多個,作用如下:

  • 運行Map Task和Reduce Task
  • 與JobTracker交互,執行命令,並彙報任務狀態

Map Task 是Map引擎,完成如下功能:

  • 解析每條數據記錄,傳遞給用戶編寫的Mapper
  • 將Mapper輸出數據寫入本地磁盤(如果是map-only作業,則直接寫入HDFS)

Reduce Task是Reduce引擎,完成如下功能:

  • 從Map Task上遠程讀取輸入數據
  • 對數據排序
  • 將數據按照分組傳遞給用戶編寫的Reducer

MapReduce 2.0架構

在Hadoop2.0中引入了 YARN資源管理器(ResourceManager和NodeManager)。

  •  1.用戶通過Client與YARN交互,將MapReduce作業提交給ResourceManager,每一個MapReduce作業對應一個MRAppMaster,其中封裝了MapReduce作業所需要的資源要求。
  • 2.Resource Scheduler 根據MRAppMaster的資源需求從集羣中指定一個節點來運行MRAppMaster。
  • 並通過Applications Manager 與該節點上的Node Manager進行通信,發送命令啓動MRAppMaster。
  • 3.MRAppMaster啓動之後會向Applications Manager 進行註冊。
  • 4.MRAppMaster向Resource Scheduler申請資源來執行Map Task和Reduce Task。
  • 5.Resource Scheduler爲MRAppMaster分配節點資源後,MRAppMaster與節點上的Node Manager進行通信,通知Node Manager啓動Map Task和Reduce Task。
  • 6.Node Manager 執行啓動命令啓動Map Task和Reduce Task。
  • 7.Map Task和Reduce Task在執行過程中通過心跳向MRAppMaster彙報自己的進度和狀態。此時用戶可以通過client與MRAppMaster交互,查看作業運行狀態、管理作業。
  • 8.MRAppMaster 向Applications Manager彙報作業執行進度和狀態,並在作業執行完成後通知ResourceManager進行資源回收。

整個運行流程如下圖所示。

 MRAppMaster的功能類似於1.0中的JobTracker,但不負責資源管理;功能包括:任務劃分、資源申請並將之二次分配給Map Task和Reduce Task、任務狀態監控和容錯。

MRAppMaster容錯性:一旦作業運行失敗,由YARN的ResourceManager負責重新啓動,最多重啓次數可由用戶設置,默認是2次。一旦超過最高重啓次數,則作業運行失敗。

Map Task和Reduce Task週期性向MRAppMaster彙報心跳,一旦Task掛掉,則MRAppMaster將爲之重新申請資源,並運行之。最多重新運行次數可由用戶設置,默認4次。

數據本地性

 什麼是數據本地性( data locality)

如果任務運行在它將處理的數據所在的節點,則稱該任務具有“數據本地性”,本地性可避免跨節點或機架數據傳輸,提高運行效率。

數據本地性分類:

  • 同節點(node-local)
  • 同機架(rack-local)
  • 其他( off-switch)

如下圖所示,執行Task1所需的數據b1剛剛好在H1節點上,符合同節點(node-local)。Task2執行在H4節點,但其所需的數據b2卻位於同機架R2下的H5上,所以符合同機架(rack-local)。Task3執行在機架R3下的H7節點,但其所需的數據b3卻位於機架R2下的H5和H6上,屬於其他( off-switch)情況。

 推測執行機制

一個MapReduce 作業由若干個Map任務和Reduce任務構成,作業的完成時間取決於最慢的任務完成時間。有時會因硬件老化、軟件Bug等意外,導致某些任務可能運行非常慢。推測執行機制就是專門來處理這些意外情況的。

  • 發現拖後腿的任務,比如某個任務運行速度遠慢於任務平均速度
  • 爲拖後腿任務啓動一個備份任務,同時運行
  • 誰先運行完,則採用誰的結果

不能啓用推測執行機制的情況,例如:

  • 任務間存在嚴重的負載傾斜,某些Task的運算量本來就遠高於其他的Task;
  • 特殊任務,比如向數據庫中寫數據的任務,會導致內容重複寫增加數據庫負擔;

需根據實際情況,決定是否爲MapReduce啓用推測執行機制,默認推測執行機制是啓用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章