MR 01 - MapReduce 計算框架入門

1 - 什麼是 MapReduce

維基百科中,MapReduce 是 Google 提出的一個軟件架構,用於大規模數據集(大於1TB)的並行運算

MapReduce 是 Hadoop 框架的一個模塊,其核心就是“先分再合,分而治之”,它把整個並行計算過程抽象成2個階段:

  • Map(映射),負責“分”,就是把複雜的任務分解成若干個“簡單的任務”來並行處理。可以拆分的前提是,這些小任務可以並行計算,彼此間幾乎沒有依賴關係
  • Reduce(化簡/歸納),負責“合”,就是把 Map 階段的子結果合併成最終的結果。

一個簡單的 MapReduce 程序只需要指定 map()、reduce()、input 和 output,剩下的事由 Hadoop MapReduce 框架幫你完成。

還難以理解?再來一個比喻:

我們要統計圖書館中的1000個書架上的書,一個人統計,耗時會很久;

我們找到1000個同學幫忙,每個人統計1個書架,記錄好統計的結果 —— Map 過程;

1000個同學都統計結束後,把所有結果再彙總到一起,就得到了最終的結果 —— Reduce 過程。

2 - MapReduce 的設計思想

MapReduce 是一個分佈式計算的編程框架,核心功能是將用戶編寫的業務代碼和自帶的默認組件整合成一個完整的分佈式程序,併發運行在 Hadoop 集羣上。

2.1 如何海量數據:分而治之

MapReduce 對 相互間不具有計算依賴關係的數據,採取分而治之的策略。

MapReduce的执行流程

從上圖可以看到,MapReduce 的執行過程涉及到:輸入(input)、按照定義好的計算模型對 input 進行計算,最終得到輸出(output)。

2.2 方便開發使用:隱藏系統層細節

如果要從頭開發一套 MapReduce 作業,開發人員需要考慮數據存儲、劃分、分發、結果收集、錯誤恢復等諸多細節。

爲了減少開發人員的工作,MapReduce 設計並提供了統一的計算框架,隱藏了系統層面的處理細節,開發人員只需要編寫少量的處理應用本身計算問題的代碼,MapReduce 框架負責完成並行計算任務相關的系統層細節,比如:分佈式任務的調度和監控,重新執行已經失敗的任務等等。

就是說,開發人員只需知道具體怎麼做(how to do),不用關注需要做什麼(what need to do)。

2.3 構建抽象模型:Map 和 Reduce

MapReduce 借鑑了函數式編程語言的思想,它提供了 Map 和 Reduce 兩個抽象的編程接口。

map和reduce接口

MapReduce 處理的數據類型是 <key, value> 鍵值對

Map 階段是把數據從一種形式轉化成另一種形式,如: (k1; v1) → [(k2; v2)]

Reduce 階段是對 Map 的結果進行進一步的整理,如:(k2; [v2]) → [(k3; v3)]

函數 輸入 輸出 說明
map <k1, v1>
如:<第一行, "abb">
List(<k2, v2>)
如:<"a", 1>
<"b", 2>
1、把數據集解析成 <key, value>,輸入到 map 中;
2、輸入的 <k1, v1> 可能會輸出一批中間結果 <k2, v2>
reduce <k2, List(v2)>
如:<"b", <1, 1>
<k3, v3>
如:<"b", 4>
<k2, List(v2)> 中的 List(v2) 表示一批 v2 屬於同一個 k2

3 - MapReduce 的優劣

3.1 MapReduce 的優勢

1)易於編程

開發人員只需要實現一些接口,就可以完成一個分佈式程序,這個程序可以分佈到大量廉價的 PC 機器上運行。

2)良好的擴展性

當計算資源不夠的時候,通過增加機器就能擴展 MapReduce 的計算能力。

3)高容錯性

MapReduce 設計的初衷就是使程序能夠部署在廉價的 PC 機器上,這就要求它具有很高的容錯性。

如果某些機器發生了故障,MapReduce 可以把故障節點的計算任務轉移到健康的節點上繼續運行。

這個過程不需要人工參與,而完全是由 Hadoop 內部完成的。

4)優秀的數據處理能力

MapReduce 將作業劃分爲多個節點,每個節點同時處理作業的一部分。

通過並行處理的方式,可以實現上千臺服務器集羣併發工作,完成 PB 級以上海量數據的離線處理,提高數據處理能力。

5)計算向數據靠攏

海量的數據分佈在多個節點中,MapReduce 會在各個數據節點處理數據,而不是將數據移動到其他節點去計算。這有如下好處:

  • 將處理單元移動到數據所在位置可以降低網絡成本;
  • 由於所有節點並行處理其部分數據,因此處理時間縮短;
  • 每個節點都會獲取要處理的數據的一部分,因此節點不會出現負擔過重的可能性。

3.2 MapReduce 的限制

1)不能進行流式計算和實時計算,只能計算離線數據;

2)不擅長 DAG(有向無環圖)計算,多個應用程序存在依賴關係,後一個應用程序的輸入爲前一個的輸出。爲了解決這個問題,MapReduce 作業的中間結果都會寫到磁盤,加大了磁盤的 I/O 負載,導致性能低下;

3)開發工作量大,例如簡單的單詞統計(wordcount),MapReduce 需要很多的設置和代碼,而 Spark 實現起來會很簡單。

參考資料

https://juejin.cn/post/6844903687094009863

版權聲明

作者:瘦風(https://healchow.com)

出處:博客園-瘦風的南牆(https://www.cnblogs.com/shoufeng)

感謝閱讀,公衆號 「瘦風的南牆」 ,手機端閱讀更佳,還有其他福利和心得輸出,歡迎掃碼關注🤝

本文版權歸博主所有,歡迎轉載,但 [必須在頁面明顯位置標明原文鏈接],否則博主保留追究相關人士法律責任的權利。

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