圖文簡述MapReduce(一)

  • 2019 年 10 月 6 日
  • 筆記

提到大數據,其實最核心的在於計算,像雙11實時統計交易量、智慧交通實時統計擁堵指數,這些離不開高並發計算。經常我們在聽到mapreduce、以及spark、hive、pig、spark streaming、Storm,很多詞語讓我們迷茫,但實際萬變不離其中,計算最核心的還是在於mapreduce。因此了解mapreduce的運行原理是必須的。

一、首先我們來作一個簡單的理解

像下圖,在HDFS上有一個超過PB級的數據,我們想統計該數據中China的出現次數,如果按照常規的單機數據檢索方法預計需要幾天的時間。而通過MapReduce將數據切塊(map)至不同的服務器,服務器經過檢索運算後,將結果傳送至某幾台服務器進行合併計算(reduce),最終將計算結果放回HDFS中。如果服務器調度的資源能力夠強、服務器數量夠多,運算時間能從幾天下降到幾分鐘時間。

二、下面我們來看看詳細的工作流程

1 用戶JAVA程序代碼調用MapReduce的SDK提交計算任務;

2 用戶的SDK包向JobTracker獲取作業Id;

3 用戶的SDK將運行作業所需資源(包括JAR包,作業配置,計算所得的分片信息),發送到HDFS上的公共目錄中;

4 用戶SDK告知JobTracker作業準備就緒,向JobTracker提交作業;

5 JobTracker初始化作業,將作業加入作業調度隊列;

6 JobTracker從HDFS中獲取作業的分片信息,根據分片的個數創建對應的對象監控和調度Map任務;

7 Map/Reduce任務的分配:Tasktracker作為MapReduce框架中的Slave節點,會通過一個簡單的循環定時(可配置,缺省為10秒)通過RPC向JobTracker發送心跳,以便使JobTracker知曉TaskTracker是否存活,同時充當JobTracker與TaskTracker之間的通信通道;TaskTracker在發送的心跳同時,會告知JobTracker自己是否準備好運行新的任務。對於Map和Reduce任務,每一個TaskTracker都有一定數量的限制,被稱為任務槽位,例如,一個TaskTracker只能同時運行兩個Map作業和兩個Reduce作業,這個個數受到TaskTracker所在的機器的Cpu和內存的限制。另外,JobTracker對於Map任務的分配採取數據本地化和機架本地化原則,盡量使Map任務所在的機器與該Map任務輸入的分片數據所在的物理存儲處於最近的網絡位置;而對於Reduce任務則沒有必要做這種考慮;

8 TaskTracker通過心跳通信,獲得了一個任務,將作業的JAR包和配置,從HDFS共享目錄中複製到本地文件系統,在本地創建臨時工作目錄,將JAR包解壓到臨時工作目錄中;

9 TaskTracker創建TaskInProgress對象監控和調度Map/Reduce任務。

10 Child子進程會加載JAR包執行Map/Reduce任務,開始任務的執行。

11 最後TaskTracker將結果回寫至HDFS中。

三、最後,MapReduce適用哪些場景呢?

1、離線批量計算。因MapReduce調度機制複雜,計算時間長,不適於用流式的實時計算。實時計算建議採用Storm或Spark Streaming

2、大容量計算。因分佈式計算的優勢,適合於數據量大、計算量大的計算過程。