hadoop學習筆記--7.MapReduce的工作機制

一、hadoop MapReduce架構


這裏寫圖片描述
        MapReduce的整個架構如上圖所示,同HDFS一樣,Hadoop MapReduce也採用了Master/Slave架構,其主要由以下4大組件構成。
        (1):Client
        client節點上運行MapReduce程序和JobClient,負責提交MapReduce作業和用戶顯示處理結果。
        (2):JobTracker
        JobTracker主要負責資源監控和作業調度。JobTracker監控所有TaskTrack與作業的健康狀態,一旦某個節點作業失敗,就會將相應的任務轉移到其他的節點上。JobTracker的功能包括制訂MapReduce作業的執行計劃,分配任務的Map和Reduce的執行節點,監控任務的執行,重新分配失敗的任務。每個Hadoop集羣中僅有一個JobTracker。
        (3):TaskTracker
        TaskTracker會週期性的通過Heartbeat將本節點資源的使用情況和任務運行的進度彙報給JobTracker,同時接收來自JobTracker的命令並執行相應的操作。TaskTracker 分爲MapTracker和ReduceTracker。
        (4):Task
        Task分爲Map Task 和Reduce Task兩種,均由TaskTracker啓動。
Map Task執行過程如下圖所示:
這裏寫圖片描述
        Map Task首先從HDFS中讀取輸入的數據,並解析成一個個Key/value對,依次調用用戶自定義的map()函數,最終將Map的結果存在至本地的磁盤上。其中,Partition()會對Map產生的結果進行分片,以便將同一組的數據交個同一個Reduce處理,一般會根據哈希函數進行數據的均勻分佈。
Reduce Task執行過程如下圖所示:
這裏寫圖片描述
        Reduce Task處理過程主要分爲3個部分,1:從遠程節點上讀取Map Task的中間結果(shuffle階段)。2:按照Key/Value對數據進行排序(sort階段) 3:依次讀取排序後的key/values結果集,調用用戶自定義的Reduce()函數處理,並將最終結果存在HDFS上。

二、hadoop MapReduce作業運行流程


這裏寫圖片描述
        1、作業提交
        (1)、在客戶端啓動一個作業(步驟1).
        (2)、向JobTracker請求一個Job ID。(步驟2).
        (3)、檢查作業的輸出目錄,如果目錄已存在,則會返回錯誤信息給MapReduce程序。
        (4)、計算作業的輸入分片,如果分片無法計算,即輸入路徑不存在,則作業不提交,返回錯誤。
        (5)、將運行作業所需要的資源,如JAR包,作業的配置文件,計算的輸入分片等複製到一個以作用ID命名的目錄下JobTracker的目錄中。(步驟3).
        (6)、完成以上工作後,Jobclient會向JobTracker發出作業提交請求(步驟4).

        2、作業初始化
        (1)、當JobTracker收到任務提交請求後,會把此任務放在內部隊列中,交給作業調度器進行調度,並對其初始化。(步驟5).
        (2)、作業調度器從共享文件系統中獲取JobClient已計算好的輸入分片信息,爲每一個分片創建一個Map任務,創建的Reduce任務由mapred.reduce.Task屬性決定。(步驟6).

        3、任務分配
        TaskTracker每隔一段時間會給JobTracker發送一個心跳,告訴JobTracker它依然在運行,同時心跳中還攜帶着很多的信息,比如當前map任務完成的進度等信息。當JobTracker收到作業的最後一個任務完成信息時,便把該作業設置成“成功”。當JobClient查詢狀態時,它將得知任務已完成,便顯示一條消息給用戶。JobTracker會優先填滿Map任務槽,只要有空閒的Map任務槽,就會分配一個map任務,map任務槽滿了才分配Reduce任務。

        4、Map任務執行
        在Map TaskTracker收到JobTracker分配的map任務後,將執行一系列的操作執行此任務。首先,會創建一個TaskInProgress對象實例以調度和監控任務。然後將作業的Jap文件和作業的配置文件從文件系統中取出,並複製到本地工作目錄下。再次,TaskTracker會新建一個TaskRunner實例來運行此Map任務。Taskrunner將會啓動一個單獨的JVM,並在其中運行map函數。MapTask計算獲得的數據,定期存入緩存中,並在緩存滿的情況下存入本地磁盤中。任務執行過程中,定期與TaskTracker通信匯報任務進度,直到任務完成,將所有的計算結果存入到本地磁盤中。

        5、Reduce任務執行
        在部分Map任務執行結束後,JobTracker會以相同的機制給Reduce TaskTracker分配Reduce任務。Reduce TaskTracker也會在單獨JVM中的Reduce Task執行Reduce函數。同時,ReduceTask會從遠程節點下載map產生的中間結果。當所有的Map任務執行完成後,JobTracker會通知所有的Reduce TaskTracker節點開始Reduce任務的執行。同樣,任務執行過程中,定期與TaskTracker通信匯報任務進度,直到任務完成。

        6:任務完成
        當JobTracker收到作業的最後一個任務完成信息時,便把該作業設置成“成功”。當JobClient查詢狀態時,它將得知任務已完成,便顯示一條消息給用戶。

參考資料


Hadoop深入學習:Map Task和Reduce Task的執行流程
http://flyingdutchman.iteye.com/blog/1876189

MapReduce工作原理圖文
http://blog.csdn.net/paul_wei2008/article/details/19348233

劉軍,Hadoop大數據處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章