MapReduce工作機制

作爲一個從未接觸過Hadoop的人來說Map Reduce,如果大家看的有問題,就立刻警覺這人有毛病。。。

1MapRecude作業運行機制

1.1 概述

概述

用途
MapReduce是一種計算框架,用於大規模數據的並行處理。

作業和任務

  • MapReduce 作業( Job )是指客戶端需要執行的一個工作單元(它包括輸入數據、MapReduce程序和配置信息)。
  • Hadoop將作業分成若干個小任務(Task)來執行,其中包括兩類任務:map任務和reduce任務。

數據流

  • Hadoop將輸入數據劃分成等長的小數據塊,稱爲分片(split);
  • 一個合理的分片大小趨向於HDFS的一個塊的大小,默認是64M;
  • 在存有輸入數據的節點上運行map任務可以獲得最佳性能,這就是所謂的本地化優化

Jortracker

  • Jobtracker是主線程,它負責接收客戶作業提交,調度任務到工作節點上運行,並提供諸如監控工作節點狀態及任務進度等管理功能,一個MapReduce集羣有一個jobtracker,一般運行在可靠的硬件上。

  • tasktracker是通過週期性的心跳來通知jobtracker其當前的健康狀態,每一次心跳包含了可用的map和reduce任務數目、佔用的數目以及運行中的任務詳細信息。Jobtracker利用一個線程池來同時處理心跳和客戶請求。

  • 當一個任務被提交時,組成作業的每一個任務的信息都會存儲在內存中,在任務運行的時候,這些任務會伴隨着tasktracker的心跳而更新,因此能近乎實時的反映任務進度和健康狀況。

Tasktracker

第二個後臺程序—tasktracker—由jobtracker指派任務,實例化用戶程序,在本地執行任務並週期性地向jobtracker彙報狀態。

在每一個工作節點上永遠只會有一個tasktracker。

Tasktracker和DataNode運行在一個機器上,從而使得每一臺物理機器既是一個計算節點,同時也是一個存儲節點。每一個tasktracker能夠配置map和reduce的任務片數(taskslot),這個數字代表每一種任務能被並行執行的數目。
1 MapReduce作業運行機制
在這裏插入圖片描述
1.1 作業的提交

  • 1.執行runjob()方法創建一個JobClient實例,見步驟1;

  • 2.向JobTracker請求一個新的作業Id,檢查作業的輸出說明,計算作業的輸入分片,見步驟2;

  • 3.復製作業資源(Jar文件、配置文件和計算所得分片信息)到以作業ID命名的的目錄下的Jobtracker的文件系統下,見步驟3;

  • 4.調用Jobtracker的submitjob()方法來通知Jobtracker作業準備執行,見步驟4.

1.2 作業的初始化

  • 1.創建一個表示正在運行作業的對象——封裝任務和記錄信息,以便跟蹤任務的狀態和進程,見步驟5;

  • 2.獲取已經計算好的輸入分片信息,爲每一個分片創建一個map任務(reduce任務的個數由用戶配置),將任務放入任務列表,見步驟6.

1.3 任務的分配

  • 1.TaskTracker定期發送“心跳”給JobTracker. “心跳”告知JobTracker它是否存活,同時也充當兩者之間的消息通道。作爲“心跳”的一部分,tasktracker會指明它是否已經準備好運行新的任務,如果是,jobtracker會爲它分配一個任務,並使用“心跳”的返回值與tasktracker進行通信,見步驟7;
  • 2.Jobtracker爲tasktracker選擇任務之前,必須先選定任務所在的作業;
  • 3.選擇map任務時,jobtracker會考慮tasktracker的網絡位置,選在一個距離其輸入分片最近的tasktracker。

1.4 任務的執行

  • 1.把作業的JAR 文件等資源複製到TaskTracker所在的文件系統,見步驟8; 然後Tasktracker解壓JAR文件到本地目錄;然後,新建一個TaskRunner實例來運行該任務;
  • 2.TaskRunner啓動一個新的JVM,見步驟9;
  • 3.在JVM運行任務,見步驟10.

1.5 進度和狀態的更新
在這裏插入圖片描述
一個作業和每個任務都有一個狀態信息,包括:作業或任務的運行狀態(running, successful, failed),map和reduce的進度,計數器值,狀態消息或᧿述。


這些信息通過一定的時間間隔由child JVM –> task tracker –> job tracker匯聚。job tracker將產生一個表明所有運行作業及其任務狀態的全局試圖。你可以通過Web UI查看。同時JobClient通過每秒查詢jobtracker來獲得最新狀態。

1.5 作業的完成

  • 當jobtracker收到作業最後一個任務已完成的通知後,便把作業的狀態設置爲“成功”。然後,在Job查詢狀態時,便知道任務已成功完成,於是Job打印一條消息告知用戶,然後從wairForCompetion()方法返回。Job的統計信息和計數值也在這時輸出到控制檯。
  • 如果jobtracker有相應的設置,也會發送一個HTTP作業通知。
  • 最後,jobtracker清空作業的工作狀態。

作業的調度

FIFO Scheduler

  • 這個調度是Hadoop默認的 ,使用FIFO調度算法來運行Job,並且可以設置優先級,但是這個FIFO調
    度並不支持搶佔,所以後來的高優先級的Job仍然會被先來低優先級的Job所阻塞。

Fari Scheduler

  • Fair Scheduler的目標是讓每個用戶公平的享有集羣當中的資源,多個Job提交過來後,空閒的任務槽資源可以以“讓每個用戶公平共享集羣”的原則被分配,某個用戶一個很短的Job將在合理時間內完成,即便另一個用戶有一個很長的Job正在運行。
  • 一般Job都放在Job池當中,默認時,每個用戶都有自己的Job池,當一個用戶ᨀ交的Job數超過另一個用戶時,不會因此得到更多的集羣資源。
  • 另外Fair Scheduler支持搶佔,如果一個池的資源未在一段時間內公平得到集羣資源,那麼Fair Scheduler會從終止得到多餘集羣資源的Task,分給前者。

Capacity Scheduler

  • Capacity Scheduler(容量調度器)中,集羣資源會有很多隊列,每個隊列有一定的分配能力,在每個隊列內會按照FIFOScheduler去分配集羣資源。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章