大資料入門:MapReduce基本原理

加米穀大資料張老師發表於2020-11-24

在圍繞Hadoop形成的大資料技術生態當中,MapReduce的地位,在早期是處於核心地位的,但是伴隨著資料處理實時性需求的不斷提升,更多新的計算框架出現,MapReduce的地位受到壓制,但是作為Hadoop原始計算框架,還是需要相應程度的瞭解和掌握的。今天的大資料入門分享,我們來具體講一講MapReduce基本原理。

一、什麼是MapReduce?

在Hadoop技術生態當中,MapReduce是作為計算引擎出現的,在處理超大規模的資料集上,MapReduce效能可觀,通過分散式計算,將大規模資料計算任務分解,分佈到不同的計算節點去平行計算,從而使得低成本下的大規模資料計算成為可能。

MapReduce的原型,公認的說法,是來自Google公司2004年釋出的MapReduce論文,而後Doug Cutting根據谷歌的論文,實現了MapReduce,並將其作為Hadoop的一個元件開源。在Hadoop當中,MapReduce也是處於核心元件的地位。

二、MapReduce解決了什麼問題?

網際網路、移動網際網路的高度發達,為資料儲存和資料計算都帶來了新的挑戰。當資料的規模大到一定程度,單獨的機器已經無法負荷。那麼能夠怎麼辦呢?首先能夠想到的辦法,就是增加機器。

而要想讓一定數量的機器實現協同工作,並且工作效率要求還不低,應該怎麼去實現呢?這就是MapReduce需要解決的問題。MapReduce作為一個分散式平行計算框架,就是一個把一群機器組織起來工作的程式設計模型。

三、MapReduce是怎麼解決的?

MapReduce,其實從執行來說,就是分為大的兩個階段的,一個階段是MapTask(將大任務拆分為小任務),第二個階段是ReduceTask(小任務計算結果重組),兩個階段之間,有個Shuffle的過程。

MapTask

整個MapTask分為Read階段,Map階段,Collect階段,溢寫(spill)階段和combine階段。

Read階段:MapTask通過使用者編寫的RecordReader,從輸入InputSplit中解析出一個個key/value;

Map階段:該節點主要是將解析出的key/value交給使用者編寫map()函式處理,併產生一系列新的key/value;

Collect收集階段:在使用者編寫map()函式中,當資料處理完成後,一般會呼叫OutputCollector.collect()輸出結果。在該函式內部,它會將生成的key/value分割槽(呼叫Partitioner),並寫入一個環形記憶體緩衝區中;

Spill階段:即“溢寫”,當環形緩衝區滿後,MapReduce會將資料寫到本地磁碟上,生成一個臨時檔案。需要注意的是,將資料寫入本地磁碟之前,先要對資料進行一次本地排序,並在必要時對資料進行合併、壓縮等操作;

Shuffle

Map方法之後,Reduce方法之前的資料處理過程稱之為Shuffle。shuffle流程如下:

  • MapTask收集map()方法輸出的kv對,放到環形緩衝區中;
  • 從環形緩衝區不斷溢位到本地磁碟檔案,可能會溢位多個檔案;
  • 多個溢位檔案會被合併成大的溢位檔案;
  • 在溢位過程及合併的過程中,都要呼叫Partitioner進行分割槽和針對key進行排序;
  • ReduceTask根據自己的分割槽號,去各個MapTask機器上取相應的結果分割槽資料;
  • ReduceTask將取到的來自同一個分割槽不同MapTask的結果檔案進行歸併排序;
  • 合併成大檔案後,shuffle過程也就結束了,進入reduce方法。

ReduceTask

整個ReduceTask分為Copy階段,Merge階段,Sort階段(Merge和Sort可以合併為一個),Reduce階段。

Copy階段:ReduceTask從各個MapTask上遠端拷貝一片資料,並針對某一片資料,如果其大小超過一定閾值,則寫到磁碟上,否則直接放到記憶體中;

Merge階段:在遠端拷貝資料的同時,ReduceTask啟動了兩個後臺執行緒對記憶體和磁碟上的檔案進行合併,以防止記憶體使用過多或磁碟上檔案過多;

Sort階段:按照MapReduce語義,使用者編寫reduce()函式輸入資料是按key進行聚集的一組資料。為了將key相同的資料聚在一起,Hadoop採用了基於排序的策略。由於各個MapTask已經實現對自己的處理結果進行了區域性排序,因此,ReduceTask只需對所有資料進行一次歸併排序即可;

Reduce階段:reduce()函式將計算結果寫到HDFS上。

關於大資料入門,MapReduce基本原理,以上就為大家做了一個簡單的介紹了。在Hadoop生態當中,MapReduce雖然地位日益尷尬,但是其MapReduce思想,在後來的框架(比如Spark)當中,繼續得到了繼承。

相關文章