hadoop筆記4--MapReduce框架

這一篇文章記錄一下hadoop中的分布式運算MapReduce的過程,作為《深入理解大數據》的學習筆記。

上一篇看了HDFS的基本操作,這一篇來看看MapReduce框架。

1.MapReduce基本框架

MapReduce是用來處理大規模數據的一個并行編程框架,采用了對數據“分而治之”的方法。大體上“分而治之”的基本框圖結構如下:

數據劃分和“分而治之”策略基本模型

MapReduce在總結了典型的大數據處理過程和特征的基礎上,提供了一個抽象的模型,是一個離線計算框架。它將計算過程分為了兩個階段,Map和Reduce。其中Map階段負責并行處理輸入數據,Reduce階段對Map結果進行匯總。其用Map和Reduce函數提供了兩個高層的接口。Map和Reduce兩個接口由用戶去編程實現。

Map的一般處理邏輯是:

一個數據記錄以鍵值對(k1;v1)的方式傳入map函數,map函數將處理這些鍵值對,然后以另一種鍵值對形式輸出一組鍵值對表示的中間結果[(k2;v2)]。
也就是這樣:(k1;v1) ---->map處理---->[(k2;v2)]

Reduce函數的一般處理邏輯是:

對map輸出的那組中間結果鍵值對(k2;[v2]),再進一步進行某種整理計算,最終輸出為某種形式的結果鍵值對[(k3;v3)]。
也就是這樣:(k2;[v2])---->reduce處理---->[(k3;v3)]
輸入參數變樣了是因為在進入reduce前,一般會將具有相同鍵k2下的所有值v2合并到一個集合中處理:[(k2;v2)]--->(k2;[v2]),也就是Combiner過程。

因此,在經過Map和Reduce的抽象過后,并行結構模型就長這樣:

MapReduce并行編程模型

從圖中能夠方便的看出,大數據通過數據劃分,將數據劃分成一塊一塊的,輸入各自的Map中進行處理;待所有的Map處理完畢之后,將中間結果輸入到Reduce中再進行處理,最終由Reduce處理完后的數據合起來就是我們最終的計算結果了。

上圖中也能發現,中間還有一個同步障(Barrier),其作用為要等所有的map節點處理完后才進入reduce,并且這個階段也負責對map的中間結果進行數據加工整理過程(Aggregation&Shuffle),以便reduce節點可以完全基于本節點上的數據計算最終結果。

不過以上的也還不算是完整的MapReduce編程模型。在上述框架圖中,還少了兩個步驟Combiner和Partitioner。

Combiner
MapReduce框架提供了一個叫Combiner的對象來對中間結果數據網絡傳輸進行優化。比如在Map處理完輸出很多鍵值對后,某些鍵值對的鍵是相同的,在Map節點計算完成的時候,它并不會將相同鍵的結果合并。而Combiner就可以干這個事情,它能將相同鍵的值合并,比如有兩個鍵值對的鍵相同(good,1)和(good,2),便可以合成(good,3)。這樣,可以減少需要傳輸的中間結果數據量,達到網絡數據傳輸優化。因為Map傳給Reduce是通過網絡來傳的。
Combiner程序執行在Map節點完成計算之后、輸出中間結果之前。
Partitioner
Partitioner類負責對中間結果進行分區處理,消除數據傳入Reduce節點后帶來不必要的相關性。比如統計詞頻的話,將所有主鍵相同的鍵值對傳輸給同一個Reduce節點,以便Reduce節點在不需要訪問其他Reduce節點的情況下,一次性對分過來的中間結果進行處理。
這個分區處理是在Map節點輸出后、傳入Reduce節點之前完成。

添加了Combiner和Partitioner處理后,完整的MapReduce并行編程模型如下圖所示:

完整的MapReduce并行編程模型

2.Hadoop系統構架

從邏輯上看,Hadoop系統的基本組成架構包含兩個部分:分布式存儲和并行計算兩部分。

分布式存儲(HDFS):Hadoop使用NameNode作為分布式存儲的主控節點,用以存儲和管理分布式文件系統的元數據,同時使用DataNode作為實際存儲大規模數據從節點。
并行計算(MapReduce):Hadoop使用JobTracker作為MapReduce框架的主控節點,用來管理和調度作業的執行,用TaskTracker管理每個計算從節點上任務的執行。

下圖為Hadoop系統的基本組成構架。

Hadoop系統的基本組成構架

為了實現Hadoop設計的本地化計算,數據節點DataNode和計算節點TaskTracker應放在同個節點,每個從節點也是同時運行DataNode和TaskTracker,從而讓每個TaskTracker盡量處理存儲在本地DataNode上的數據。

數據主控節點NameNode與作業執行節點JobTracker可以設置在同一個節點上,也可以考慮負載較高時,而設置在兩個節點上。

3.MapReduce執行過程

Hadoop MapReduce程序執行過程

上圖展示了在MapReduce并行計算框架上執行一個用戶提交的mapreduce程序的基本過程。

由圖中所示,整個過程包括了4個部分:用戶程序客戶端、JobTracker節點、TaskTracker節點和HDFS存儲的部分。整個過程描述:

  1. 通過JobClient提交用戶程序;
  2. JobClient向JobTracker提交作業執行請求獲得一個Job ID;
  3. JobClient復制作業資源到HDFS中存儲;
  4. JobClient向JobTracker正式提交作業;
  5. JobTracker接受并調度該作業,并完成初始化準備工作;
  6. JobTracker查詢數據分片信息,構建并準備相應的任務;
  7. JobTracker啟動TaskTracker節點開始執行任務;
  8. TaskTracker根據分配的具體任務,獲取相應作業數據;
  9. TaskTracker節點開始運行相應的任務;
  10. TaskTracker執行完任務,輸出結果;
  11. TaskTracker向JobTracker報告分配的任務已完成。

下面再看看作業執行流程和任務執行流程。

作業執行的內部流程和狀態轉換過程
任務執行的內部過程和時序流程

以上兩幅圖分別是作業的執行過程圖和任務的執行過程圖,其中:

作業的執行流程總體上可以分為三個階段:準備階段(PREP)、運行階段(RUNNING)、結束階段(FINISHED);并且在各個狀態下,作業有可能被客戶主動殺死,進入到KILLED狀態或在執行中遇到失敗,進入到FALED狀態。

任務是MapReduce框架進行并行化計算的基本單位,任務是邏輯上的概念,在MapReduce的實現中,分布于JobTracker和TaskTracker上,對應TaskInProgress和TaskTracker.TaskInProgress對象。任務的時序過程如上圖所示。

4.MapReduce執行框架的組件和執行流程

下圖為MapReduce執行框架的組件和執行流程。

MapReduce執行框架的組件和執行流程

其中的組件分別如下:

  1. 數據輸入格式InputFormat:

它是MapReduce框架中的基礎類之一,是一個抽象類,描述了MapReduce作業數據的輸入形式和格式。InputFormat可以驗證作業數據的輸入形式和格式;將輸入數據分割為若干個邏輯意義上的InputSplits;提供一個RecordReader。
hadoop提供了功能豐富的InputFormat類,實現從特定數據源或特殊目的的輸入要求。常用的有:TextInputFormat、KeyValueInputFormat、NLineInputFormat、CombineFileInputFormat、SequenceFileInputFormat、DBInputFormat等等。

  1. 輸入數據分塊InputSplits:

它也是MapReduce框架的基礎類之一。一個InputSplit將單獨作為一個Mapper的輸入,有多少個InputSplit就有多少個Mapper。用戶無法自主選定InputSplit的類型,而是在選擇某個InputFormat后就決定了對應的InputSplit。InputSplit默認將文件分為64MB的大小,hadoop-site.xml中的mapred.min.split.size參數控制這個大小。

  1. 數據記錄讀入RecordReader(RR):

InputSplit定義了一項工作的大小,但是沒有定義如何讀取數據 。RecordReader即是負責從數據分塊中讀取數據記錄轉化為鍵值對的類。它將數據輸出到Mapper類中 。

  1. Mapper:

每個Mapper對象會生成一個java進程。程序員繼承此類,用于實現Map任務。

  1. Combiner:

上面已提到過,用于合并相同key的鍵值對,減少partitioner時候的數據通信開銷。

  1. Partitioner:

上面也已提到,為了避免在Reduce計算過程中不同Reduce節點間存在相關性,需要一個Partition過程。

  1. Sort:

傳輸到每一個節點上的所有的Reduce函數接收到得Key,value對會被Hadoop自動排序;

  1. Reducer:

程序員繼承此類,用于執行Reduce任務。

  1. 文件輸出格式OutputFormat:

它是用于描述MapReduce作業的數據輸出格式和規范的抽象類。寫入到HDFS的所有OutputFormat都繼承自FileOutputFormat 。其中常用的OutputFormat有:TextOutFormat、SequenceOutFormat、NullOutFormat、DBOutFormat等,太多。

  1. 數據記錄輸出RecordWriter:

對于一個文件輸出格式,都需要一個對應的數據記錄輸出RecordWriter,以便系統明確輸出結果寫入到文件中的具體格式。如TextOutputFormat實現了默認的LineRecordWriter,以“key/value”的形式輸出一行結果。

MapReduce的內容蠻多的,上面只是粗略的介紹了一下MapReduce的基本構架,更詳細的內容可以參見《深入理解大數據》一書。

下一篇準備看一個官方的小程序wordCount的Java實現,來窺探窺探要寫一個mapreduce程序一般需要些什么步驟。

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

推薦閱讀更多精彩內容

  • MapReduce框架結構## MapReduce是一個用于大規模數據處理的分布式計算模型MapReduce模型主...
    Bloo_m閱讀 3,799評論 0 4
  • 目的這篇教程從用戶的角度出發,全面地介紹了Hadoop Map/Reduce框架的各個方面。先決條件請先確認Had...
    SeanC52111閱讀 1,767評論 0 1
  • MapReduce是一個數據處理的編程模型。這個模型很簡單,但也不是簡單到不能夠支持一些有用的語言。Hadoop能...
    單行線的旋律閱讀 1,541評論 0 2
  • Map Reduce & YARN 簡介 Apache Hadoop 是一個開源軟件框架,可安裝在一個商用機器集群...
    HarperKoo閱讀 18,592評論 6 147
  • 我不知道明天有沒有雨 只知道這個季節 是給離別多年的人準備的渡口 尋緣夜里找 情深夢自尋 乍暖還寒的天氣 剛好應了...
    不惑而歌閱讀 286評論 5 16