1. 程式人生 > >【MR原理-1】MapReduce整體架構及工作機制

【MR原理-1】MapReduce整體架構及工作機制

導讀:
1. HDFS架構
2. MapReduce架構
3. MapReduce作業的生命週期

  Hadoop的核心兩個元件分別是分散式檔案系統和分散式計算框架MapReduce。其中分散式檔案系統主要用於大規模資料的分散式儲存,而MapReduce則構建在分散式檔案系統之上,對儲存在分散式檔案系統中的資料進行分散式計算。在瞭解MapReduce工作機制之前,考慮到MapReduce的一些功能跟底層儲存機制相關,因而會首先介紹分散式檔案系統。

一、HDFS架構

  Hadoop預設使用的分散式檔案系統是HDFS(Hadoop Distributed File System),它與MapReduce框架緊密結合。HDFS是一個具有高容錯性的分散式檔案系統,適合部署在廉價的機器上,能提供高吞吐量的資料訪問,非常適合大規模資料集上的應用。
  HDFS的框架總體採用了master/slave架構,主要由以下幾個元件組成:Client、NameNode、SecondNamenode和DataNode。下面分別對這幾個元件進行介紹。

這裡寫圖片描述
HDFS架構圖

(1)Client
  Client是客戶端,是使用者操作HDFS最常用的方式,通過與NameNode和DataNode互動從而訪問HDFS中的檔案。

(2)NameNode
  NameNode是名位元組點,整個Hadoop叢集中只有一個NameNode。它是整個系統的“總管”,負責管理HDFS的目錄樹和相關的檔案元資料資訊。這些資訊是以“fsimage”(HDFS元資料映象檔案)和“editlog”(HDFS檔案改動日誌)兩個檔案形式存放在本地磁碟,當HDFS重啟時重新構造出來的。此外,NameNode還負責監控各個DataNode的健康狀態,一旦發現某個DataNode宕掉,則將該DataNode移出HDFS並重新備份其上面的資料。

(3)Second NameNode
  Second NameNode最重要的任務並不是為NameNode元資料進行熱備份,而是定期合併fsimage和edits日誌,並傳輸給NameNode。這裡需要注意的是,為了減小NameNode壓力,NameNode自己並不會合併fsimage和edits,並將檔案檔案儲存到磁碟上,而是交由Second NameNode完成。

(4)DataNode
  一般而言,每個Slave節點上安裝一個DataNode,它負責實際的資料儲存,並將資料資訊定期彙報給NameNode。DataNode以固定大小的block為基本單位組織檔案內容,預設情況下block大小為64MB。當用戶上傳一個大的檔案到HDFS上時,該檔案會被切分成若干個block,分別儲存到不同的DataNode。同時,為了保證資料可靠,會將同一個block以流水線方法寫到若干個(預設是3個,該引數可配置)不同的DataNode上。

二、MapReduce架構

  Hadoop MapReduce採用Master/Slave(M/S)架構,如下圖所示,主要包括以下元件:Client、JobTracker、TaskTracker和Task。

這裡寫圖片描述
MapReduce架構圖

(1)Client
  使用者編寫的MapReduce程式通過Client提交到JobTracker端;同時,使用者可通過Client提供的一些介面檢視作業執行狀態。在Hadoop內部用“作業”(Job)表示MapReduce程式。一個MapReduce程式可對應若干個作業,而每個作業會被分解成若干個Map/Reduce任務(Task)。

(2)JobTracker
  JobTracker主要負責資源監控和作業排程。JobTracker監控所有TaskTracker與作業的健康狀況,一旦發現失敗情況後,其會將相應的任務轉移到其他節點;同時JobTracker會跟蹤任務的執行進度、資源使用量等,並將這些資訊告訴給任務排程器(Task Scheduler),而T排程器會在資源出現空閒時,選擇合適的任務使用這些資源。在Hadoop中,任務排程器是一個可插拔的模組,使用者可以根據自己的需要設計相應的Scheduler。

(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。split與block的對應關係如下圖所示。split是一個邏輯概念,它只包含一些元資料資訊,比如資料起始位置、資料長度、資料所在節點等。它的劃分方法完全由使用者自己決定。但需要注意的是,split的多少決定Map Task的數目,因為每個split會交由一個Map Task處理。

這裡寫圖片描述
split和block的區別

(4-1)Map Task的執行過程
  Map Task先將對應的split迭代解析成一個個key/value對,依次呼叫使用者自定義的map()函式進行處理,最終將臨時結果存放到本地磁碟上,其中臨時資料被分為若干個partition,每個partition將被一個Reduce Task處理。

這裡寫圖片描述
Map Task執行過程

(4-2)Reduce Task的執行過程
  Map Task執行過程分為三個階段①從遠端節點上讀取Map Task的中間結果(稱為“Shuffle階段”);②按照key對key/value鍵值對進行排序(稱為“Sort階段”);③依次讀取<key, value list>,呼叫使用者自定義的reduce()函式處理,並將最終結果存放到HDFS上(稱為“Reduce階段”)。

這裡寫圖片描述
Reduce Task執行過程

三、MapReduce作業的生命週期

MapReduce作業的生命週期包括作業從提交到執行結束經歷的整個過程。假設使用者編寫一個MapReduce程式,並將其打包成xxx.jar檔案,然後提交作業:
$HADOOP_HOME/bin/hadoop jar xxx.jar
  -D mapred.job.name=”xxx” \
  -D mapred.map.tasks=3 \
  -D mapred.reduce.tasks=2 \
  -D input=/test/input \
  -D output=/test/output
則該作業的執行過程如下圖所示

這裡寫圖片描述
MapReduce生命週期

這個過程分為一下5個步驟:
步驟1:作業提交與初始化。
  使用者提交作業後,首先由JobClient例項將作業相關資訊,比如將程式jar包、作業配置資訊、分片原資訊檔案等上傳到分散式檔案系統(一般為HDFS)上,其中,分片資訊檔案記錄了每個輸入分片的邏輯位置資訊。然後JobClient通過RPC通知JobTracker。JobTracker收到新作業提交請求後,由作業排程模組對作業進行初始化:為作業建立一個JobInProcess物件以跟蹤作業執行狀況,而JobInProcess則會為每個Task建立一個TaskInProgress物件以跟蹤每個任務的執行狀態,TaskInProgress可能需要管理多個“Task執行嘗試”(成為“Task Attempt”)。

步驟2:任務排程與監控。
  任務排程和監控均由JobTracker完成。TaskTracker週期性地通過Heartbeat向JobTracker彙報本節點的資源使用情況,一旦出現空閒資源,JobTracker會按照一定的策略選擇一個合適的任務使用該空閒資源,這個過程由任務排程器完成。任務排程器是一個可插拔的獨立模組,且為雙層架構,即首先選擇作業,然後從該作業中選擇任務,其中,選擇任務時需要重點考慮資料本地性。此外,JobTracker跟蹤作業的整個執行過程,併為作業的成功執行提供全方位的保障。首先,當TaskTracker或者Task失敗時,轉移計算任務;其次,當某個Task執行進度遠落後於同一個同一個作業的其他Task時,為之啟動一個相同的Task,並選擇計算快的Task結果作為最終結果。

步驟3:任務執行環境準備。
  執行環境準備包括JVM啟動和資源隔離,均由TaskTracker實現。TaskTracker為每個Task啟動一個獨立的JVM以避免不同Task在執行過程中相互影響;同時,TaskTracker使用作業系統程序實現資源隔離以防Task濫用資源。

步驟4:任務執行。
  TaskTracker為Task準備好執行環境後,便會啟動Task。在執行過程中,每個Task的最新進度首先由Task通過RPC彙報TaskTracker,再由TaskTracker通過RPC彙報給JobTracker。

步驟5:作業完成。
  待所有Task執行完畢後,整個作業執行成功。

【參考資料】

[1] 董西成,《Hadoop技術內幕:深入解析MapReduce架構設計與實現原理》
[2] yr123,MapReduce程式的工作過程:
   http://www.aboutyun.com/thread-15494-1-2.html