本文主要介紹hadoop運作經典MapReduce(MapReduce1)任務過程涉及的實體及其工作原理。
涉及實體
- 用戶端:送出MapReduce作業;
- jobtracker:它協調在叢集上運作的所有作業(配置設定給tasktracker),是java應用程式,一個叢集隻有一個jobtracker。
- tasktracker:運作tasktracker配置設定的任務并定時向jobtracker彙報進度,是Java應用程式,一個叢集有多個tasktracker。
- 分布式檔案系統:用來在其他實體間共享作業檔案,一般是hdfs。
作業運作流程:
hadoop運作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方法可以查詢目前狀态全局視圖。如下圖所示。
6. 作業完成
jobtracker收到job最後一個任務完成的通知後,便把作業的狀态設定為“成功”,waitForCompletion()方法傳回。最後jobtracker和tasktracker清空工作狀态和中間輸出等。
局限性
大型的 Hadoop 叢集顯現出了由單個 JobTracker 導緻的可伸縮性瓶頸。