天天看點

經典MapReduce任務執行流程詳解

本文主要介紹hadoop運作經典MapReduce(MapReduce1)任務過程涉及的實體及其工作原理。

涉及實體

  1. 用戶端:送出MapReduce作業;
  2. jobtracker:它協調在叢集上運作的所有作業(配置設定給tasktracker),是java應用程式,一個叢集隻有一個jobtracker。
  3. tasktracker:運作tasktracker配置設定的任務并定時向jobtracker彙報進度,是Java應用程式,一個叢集有多個tasktracker。
  4. 分布式檔案系統:用來在其他實體間共享作業檔案,一般是hdfs。

作業運作流程:

hadoop運作mapReduce作業整體流程如下圖所示。

經典MapReduce任務執行流程詳解

1. 作業送出

job的submit()方法建立一個内部的JobSubmiter執行個體,并調用其submitJobInternal()方法。

job的submit()方法執行後在調用job.waitForCompletion(),每秒輪詢作業進度,并列印至控制台。

JobSubmiter所實作作業送出過程如下:

① 向jobtracker請求一個新的作業id;

② 檢查作業輸出目錄是否定義和是否已經存在,若存在則不送出作業,并抛異常;

③ 計算作業輸入分片;

④ 将作業運作需要的資源複制到jobtracker叢集中一個作業id命名的目錄下;

⑤ 告知jobtracker作業準備就緒,jobtraker将該作業該放入一個内部作業隊列中,并交由作業排程器(job scheduler)進行排程。

2. 作業初始化

① 作業被排程執行時對作業進行初始化,建立一個表示正在運作作業的對象,用于封裝任務和記錄資訊,以便跟蹤任務狀态和進度。

② 建立任務清單,每個輸入分片建立一個map任務。reduce任務由mapred.reduce.tasks屬性決定。同時還會建立兩個任務:作業建立和作業清理任務。兩個任務均在taskTracker中執行。作業建立任務在map任務運作前執行,用來建立作業,建立輸出目錄和臨時工作空間;作業清理任務在reduce任務完成之後執行的,用于清理臨時工作空間。

3. 任務配置設定

tasktracker會定期向jobtracker發送心跳(heartbeat),表明tasktracker的存活狀态,同時也是二者的資訊通道。作為心跳的一部分,tasktracker會指明它是否已經準備好運作新的任務,如果是,jobtracker會為它配置設定一個任務(使用心跳的傳回值與tasktracker進行通信)。

4. 任務執行

① 從hdfs檔案系統中将作業JAR包複制到tasktracker本地,同時将程式要讀取的檔案資源複制到tasktracker本地;

② tasktracker為任務建立一個本地工作目錄,并把jar包解壓到該檔案夾下;

③ tasktracker建立一個TaskRunner執行個體來運作該任務。

④ TaskRunner 啟動一個新的JVM來運作該job的每個任務(可以避免因map或reduce任務内部異常導緻tasktracker崩潰或挂起),該程序每隔幾秒鐘便告知父程序(tasktracker)進度,直到任務完成。

5. 任務進度和狀态更新

TaskRunner啟動的子程序定時向tasktracker彙報進度,tasktracker通過heartbeat将任務狀态發送至jobtracker,jobtracker進行彙總形成job狀态的全局視圖,用戶端通過job的getStatus方法可以查詢目前狀态全局視圖。如下圖所示。

經典MapReduce任務執行流程詳解

6. 作業完成

jobtracker收到job最後一個任務完成的通知後,便把作業的狀态設定為“成功”,waitForCompletion()方法傳回。最後jobtracker和tasktracker清空工作狀态和中間輸出等。

局限性

大型的 Hadoop 叢集顯現出了由單個 JobTracker 導緻的可伸縮性瓶頸。

繼續閱讀