1. 程式人生 > >hadoop入門筆記MapReduce Shuffle簡介(五)

hadoop入門筆記MapReduce Shuffle簡介(五)

單位 海量數據 並行處理 詳細 但是 信息 不能 utf 適合

1. MapReduce 定義

  Hadoop 中的 MapReduce是一個使用簡單的軟件框架,基於它寫出來的應用程序能夠運行在由上千個商用機器組成的大型集群上,並以一種可靠容錯式並行處理TB級別的數據集

2. MapReduce 特點

   MapReduce 為什麽如此受歡迎?尤其現在互聯網+時代,互聯網+公司都在使用 MapReduce。MapReduce 之所以如此受歡迎,它主要有以下幾個特點。
- MapReduce 易於編程。它簡單的實現一些接口,就可以完成一個分布式程序,這個分布式程序可以分布到大量廉價的 PC 機器運行。也就是說你寫一個分布式程序,跟寫一個簡單的串行程序是一模一樣的。 就是因為這個特點使得 MapReduce 編程變得非常流行。
- 良好的擴展性

。當你的計算資源不能得到滿足的時候,你可以通過簡單的增加機器來擴展它的計算能力。
- 高容錯性。MapReduce 設計的初衷就是使程序能夠部署在廉價的 PC 機器上,這就要求它具有很高的容錯性。比如其中一臺機器掛了,它可以把上面的計算任務轉移到另外一個節點上面上運行,不至於這個任務運行失敗,而且這個過程不需要人工參與,而完全是由 hadoop 內部完成的。
- 適合 PB 級以上海量數據的離線處理。這裏加紅字體離線處理,說明它適合離線處理而不適合在線處理。比如像毫秒級別的返回一個結果,MapReduce 很難做到。
  MapReduce 雖然具有很多的優勢,但是它也有不擅長的地方。這裏的不擅長不代表它不能做,而是在有些場景下實現的效果差,並不適合 MapReduce 來處理,主要表現在以下幾個方面。
- 實時計算
。MapReduce 無法像 MySQL 一樣,在毫秒或者秒級內返回結果。
- 流式計算。流式計算的輸入數據時動態的,而 MapReduce 的輸入數據集是靜態的,不能動態變化。這是因為 MapReduce 自身的設計特點決定了數據源必須是靜態的。
- DAG(有向圖)計算。多個應用程序存在依賴關系,後一個應用程序的輸入為前一個的輸出。在這種情況下,MapReduce 並不是不能做,而是使用後,每個MapReduce 作業的輸出結果都會寫入到磁盤,會造成大量的磁盤IO,導致性能非常的低下。


3. MapReduce的架構

  和HDFS一樣,MapReduce也是采用Master/Slave的架構,其架構圖如下所示。
  技術分享


   MapReduce包含四個組成部分,分別為Client、JobTracker、TaskTracker和Task,下面我們詳細介紹這四個組成部分。
   1)Client 客戶端
   每一個 Job 都會在用戶端通過 Client 類將應用程序以及配置參數 Configuration 打包成 JAR 文件存儲在 HDFS,並把路徑提交到 JobTracker 的 master 服務,然後由 master 創建每一個 Task(即 MapTask 和 ReduceTask) 將它們分發到各個 TaskTracker 服務中去執行。

   2)JobTracker
  JobTracke負責資源監控和作業調度。JobTracker 監控所有TaskTracker 與job的健康狀況,一旦發現失敗,就將相應的任務轉移到其他節點;同時,JobTracker 會跟蹤任務的執行進度、資源使用量等信息,並將這些信息告訴任務調度器,而調度器會在資源出現空閑時,選擇合適的任務使用這些資源。在Hadoop 中,任務調度器是一個可插拔的模塊,用戶可以根據自己的需要設計相應的調度器。
  
   3)TaskTracker
  TaskTracker 會周期性地通過Heartbeat 將本節點上資源的使用情況和任務的運行進度匯報給JobTracker,同時接收JobTracker 發送過來的命令並執行相應的操作(如啟動新任務、殺死任務等)。TaskTracker 使用“slot”等量劃分本節點上的資源量。“slot”代表計算資源(CPU、內存等)。一個Task 獲取到一個slot 後才有機會運行,而Hadoop 調度器的作用就是將各個TaskTracker 上的空閑slot 分配給Task 使用。slot 分為Map slot 和Reduce slot 兩種,分別供Map Task 和Reduce Task 使用。TaskTracker 通過slot 數目(可配置參數)限定Task 的並發度。

   4)Task
   Task 分為Map Task 和Reduce Task 兩種,均由TaskTracker 啟動。HDFS 以固定大小的block 為基本單位存儲數據,而對於MapReduce 而言,其處理單位是split。
   Map Task 執行過程如下圖 所示:由該圖可知,Map Task 先將對應的split 叠代解析成一個個key/value 對,依次調用用戶 自定義的map() 函數進行處理,最終將臨時結果存放到本地磁盤上, 其中臨時數據被分成若幹個partition,每個partition 將被一個Reduce Task 處理。
   技術分享
   Reduce Task 執行過程下圖所示。該過程分為三個階段:
   技術分享

①從遠程節點上讀取Map Task 中間結果(稱為“Shuffle 階段”);
②按照key 對key/value 對進行排序(稱為“Sort 階段”);
③依次讀取< key, value list>,調用用戶自定義的reduce() 函數處理,並將最終結果存到HDFS 上(稱為“Reduce 階段”)。


4. MapReduce 內部邏輯

  下面我們通過 MapReduce 的內部邏輯,來分析 MapReduce的數據處理過程。我們以WordCount為例,來看一下mapreduce 內部邏輯,如下圖所示。
  技術分享 
  
  MapReduce 內部邏輯的大致流程主要由以下幾步完成。
  1、首先將 HDFS 中的數據以 Split 方式作為 MapReduce 的輸入。前面我們提到,HDFS中的數據是以 block存儲,這裏怎麽又變成了以Split 作為輸入呢?其實 block 是 HDFS 中的術語,Split 是 MapReduce 中的術語。默認的情況下,一個 Split 可以對應一個 block,當然也可以對應多個block,它們之間的對應關系是由 InputFormat 決定的。默認情況下,使用的是 TextInputFormat,這時一個Split對應一個block。 假設這裏有4個block,也就是4個Split,分別為Split0、Split1、Split2和Split3。這時通過 InputFormat 來讀每個Split裏面的數據,它會把數據解析成一個個的(key,value),然後交給已經編寫好的Mapper 函數來處理。
  2、每個Mapper 將輸入(key,value)數據解析成一個個的單詞和詞頻,比如(a,1)、(b,1)和(c,1)等等。
   4、在reduce階段,每個reduce要進行 shuffle 讀取它所對應的數據。當所有數據讀取完之後,要經過Sort全排序,排序之後再交給 Reducer 做統計處理。比如,第一個Reducer讀取了兩個的(a,1)鍵值對數據,然後進行統計得出結果(a,2)。
   5、將 Reducer 的處理結果,以OutputFormat數據格式輸出到 HDFS 的各個文件路徑下。這裏的OutputFormat默認為TextOutputFormat,key為單詞,value為詞頻數,key和value之間的分割符為”\tab”。 由上圖所示,(a 2)輸出到Part-0,(b 3)輸出到Part-1,(c 3)輸出到Part-2。

hadoop入門筆記MapReduce Shuffle簡介(五)