Hadoop Core_MapReduce總結(一)
一、 分散式計算框架 MapReduce
1、產生背景
- Web2.0 時代,資料爆炸式、指數級增長,大資料分散式計算需求頻繁
- 通過單機記憶體擴充套件來增強計算能力,已經無法承載大規模資料量的計算
- 分散式計算開發和維護的複雜與多變,對程式設計師要求太高
Google 公司為了解決其搜尋引擎中大規模網頁資料的並行化處理,研究提出的一種面向大規模資料處理的平行計算模型和方法,稱為 MapReduce。
2003 年和 2004 年,Google 公司在國際會議上分別發表了兩篇關於 Google 分散式檔案系統和
MapReduce 的論文,公佈了 Google 的 GFS 和 MapReduce 的基本原理和主要設計思想。
2004 年,Cutting 和同為程式設計師出身的 Mike Cafarella 決定開發一款可以代替當時的主流搜尋產品的開源搜尋引擎,這個專案被命名為 Nutch。2005 年初,Nutch 的開發人員在 Nutch 上實現了一個 MapReduce 系統,到年中,Nutch 的所有主要演算法均完成移植,用 MapReduce 和 NDFS 來執行。在
2006 年 2 月,開發人員將 NDFS 和 MapReduce 移出 Nutch 形成 Lucene 的一個子專案,稱為 Hadoop。
Hadoop 中 MapReduce 的實現正是基於 Google 的論文的 MapReduce 的開源實現。
2、MapReduce 是什麼
MapReduce 是一種程式設計模型,是面向大資料並行處理的計算模型、框架和平臺。
- MapReduce 是一個基於叢集的高效能平行計算平臺。可以使用普通伺服器構成一個包含數十、數百、甚至數千個節點的分散式和平行計算叢集。
- MapReduce 是一個平行計算與執行的軟體框架。它提供了一個龐大但設計精良的平行計算軟體框架,能自動劃分計算資料和計算任務,自動完成計算任務的並行化處理,實現在叢集節點上自動分配和執行任務並收集計算結果,將資料分佈儲存、資料通訊、容錯處理等平行計算涉及到的很多系統底層的複雜實現細節交由系統負責處理,大大減少了軟體開發人員的負擔。
- MapReduce 是一個並行程式設計模型與方法。它提供了一種簡便的並行程式設計方法,用 Map 和 Reduce 兩個函式程式設計實現基本的平行計算任務,提供了抽象的操作和並行程式設計介面,以簡單方便地完成大規模資料的程式設計和計算處理。
3、基本特點
- 分佈可靠,對資料集的操作分發給叢集中的多個節點實現可靠性,每個節點週期性返回它完成的任務和最新的狀態
- 封裝了實現細節,基於框架 API 程式設計,面向業務展開分散式編碼
- 提供跨語言程式設計的能力
二、 MapReduce 執行流程
1、MapReduce 的主要功能
(1)資料劃分和計算任務排程
系統自動將一個作業(Job)待處理的大資料劃分為很多個數據塊,每個資料塊對應於一個計算任務(Task),並自動排程計算節點來處理相應的資料塊。作業和任務排程功能主要負責分配和排程計算節點(Map 節點或 Reduce 節點),同時負責監控這些節點的執行狀態,並負責 Map 節點執行的同步控制。
(2)資料/程式碼互定位
為了減少資料通訊,一個基本的原則是本地化資料處理,即一個計算節點儘可能處理其本地磁碟上所分佈儲存的資料,這實現了程式碼向資料的遷移;當無法進行這種本地化資料處理時,再尋找其他可用節點並將資料從網路上傳送給該節點(資料向程式碼遷移),但儘可能從資料所在的本地機架上尋找可用節點以減少通訊延遲。
(3)系統優化
為了減少資料通訊開銷,中間結果資料進入 Reduce 節點前會進行一定的合併處理;一個 Reduce 節點所處理的資料可能會來自多個 Map 節點,為了避免 Reduce 計算階段發生資料處理不平衡,Map 節點輸出的中間結果需使用一定的策略進行適當的劃分處理,保證相關性資料傳送到同一個 Reduce 節點;此外,系統還進行一些及酸效能優化處理,如對最慢的計算任務採用多備份執行、選最快完成者作為結果。
(4)出錯檢測和恢復
以低端的商用伺服器構成的大規模 MapReduce 計算叢集中,節點硬體(主機、磁碟、記憶體等)出錯和軟體出錯是常態,因此 MapReduce 需要能檢測並隔離出錯節點,並排程分配新的節點接管出錯節點的計算任務。同時系統還將維護資料儲存的可靠性,用多備份冗餘儲存機制提高資料儲存的可靠性, 並能及時檢測和恢復出錯的資料。
2、MapReduce 的執行流程
(1)執行流程
由上圖可以看到 MapReduce 執行下來主要包含這樣幾個步驟:
- 首先對輸入資料來源進行切片
- master 排程 worker 執行 map 任務
- worker 讀取輸入源片段
- worker 執行 map 任務,將任務輸出儲存在本地
- master 排程 worker 執行 reduce 任務,reduce worker 讀取 map 任務的輸出檔案
- 執行 reduce 任務,將任務輸出儲存到 HDFS
(2)執行流程詳解
以 WordCount 為例
給定任意的 HDFS 的輸入目錄,其內部資料為“f a c d e……”等用空格字元分隔的字串, 通過使用 MapReduce 計算框架來統計以空格分隔的每個單詞出現的頻率,輸出結果如<a,10>,<b,20>,<c,2>形式的結果到 HDFS 目錄中。
MapReduce 將作業的整個執行過程分為兩個階段:Map 階段 Reduce 階段。
Map 階段由一定數量的 Map Task 組成,例如:
- 輸入資料格式解析:InputFormat
- 輸入資料處理:Mapper
- 資料分組:Partitioner
- 資料按照 key 排序
- 本地規約:Combiner(相當於 local reducer,可選)
- 將任務輸出儲存在本地
Reduce 階段由一定數量的 Reduce Task 組成,例如:
- 資料遠端拷貝
- 資料按照 key 排序
- 資料處理:Reducer
- 資料輸出格式:OutputFormat
通常我們把從 Mapper 輸出資料到 Reduce 讀取資料之間的過程稱之為 shuffle。