
MapReduce 也采用了 Master/Slave(M/S)架構。它主要由以下幾個元件組成 :Client、JobTracker、 TaskTracker 和 Task。下面分别對 這幾個元件進行介紹。
(1)Client
使用者編寫的MapReduce程式通過Client送出到JobTracker端 ;同時,使用者可通過Client提供的一些接口檢視作業運作狀态。在Hadoop内部用“作業” (Job)表示MapReduce程式。一個 MapReduce程式可對應若幹個作業,而每個作業會被分解成若幹個Map/Reduce任務(Task)。
(2)JobTracker
JobTracker 主要負責資源監控和作業排程。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。 split 與 block 的對應關系如下圖所示。split 是一個邏輯概念,它隻包含一些中繼資料資訊,比如 資料起始位置、資料長度、資料所在節點等。它的劃分方法完全由使用者自己決定。但需要注意的是,split的多少決定了Map Task的數目,因為每個split會交由一個Map Task處理。
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 階段”)。
MapReduce是一種并行程式設計模式,利用這種模式軟體開發者可以輕松地編寫出分布式并行程式。在Hadoop的體系結構中,MapReduce是一個簡單易用的軟體架構,基于它可以将任務分發到由上千台商用機器組成的叢集上,并以一種可靠容錯的方式并行處理大量的資料集,實作Hadoop的并行任務處理功能。MapReduce架構是由一個單獨運作在主節點的JobTrack和運作在每個叢集從節點的TaskTrack共同組成的。
主節點負責排程構成一個作業的所有任務,這些任務分布在不同的節點上。主節點監控它們的執行情況,并且重新執行之前失敗的任務;
從節點僅負責由主節點指派的任務。
當一個Job任務被送出時,JobTrack接收到送出作業和其配置資訊之後,就會配置資訊等發給從節點,同時排程任務并監控TaskTrack的執行。
本文轉自大資料躺過的坑部落格園部落格,原文連結:http://www.cnblogs.com/zlslch/p/5058629.html,如需轉載請自行聯系原作者