天天看點

MapReduce排程與執行原理之作業送出

前言 :本文旨在理清在Hadoop中一個MapReduce作業(Job)在送出到架構後的整個生命周期過程,權作總結和日後參考,如有問題,請不吝賜教。本文不涉及Hadoop的架構設計,如有興趣請參考相關書籍和文獻。在梳 理過程中,我對一些感興趣的源碼也會逐行研究學習,以期強化基礎。 作者 :Jaytalent 開始日期 :2013年9月9日 參考資料:【1】《Hadoop技術内幕--深入解析MapReduce架構設計與實作原理》董西成                   【2】Hadoop 1.0.0 源碼

【3】《Hadoop技術内幕--深入解析Hadoop Common和HDFS架構設計與實作原理》蔡斌 陳湘萍

一個MapReduce作業的生命周期大體分為5個階段

【1】:

1. 

作業送出與初始化

2. 任務排程與監控

3. 任務運作環境準備

4. 任務執行

5. 作業完成

現逐一學習。

由于作業送出是在用戶端完成,而初始化在JobTracker完成,本文隻關注前者,後者留待下一篇文章學習研究。

一、作業送出與初始化

以WordCount作業為例,先看作業送出的代碼片段:

這裡使用的新的MapReduce API。job.waitForCompletion(true)函數調用開始作業送出過程。接下來,依次調用:job.submit --> JobClient.submitJobInternal方法,真正實作作業送出。在JobClient.submitJobInternal方法中,主要有以下準備工作:

1. 擷取作業ID

作業ID時從JobTracker擷取的,這是一次RPC調用,方法為getNewJobId,定義在JobSubmissionProtocol接口。

Hadoop的RPC機制是基于動态代理實作的。用戶端代碼使用RPC類提供的代理對象調用伺服器的方法。MapReduce中定義了一系列協定接口用于RPC通信。這些協定包括:

a. JobSubmissionProtocol

b. RefreshUserMappingsProtocol

c. RefreshAuthorizationPolicyProtocol

d. AdminOperationsProtocol

e. InterTrackerProtocol

f. TaskUmbilicalProtocol

前面四個協定用于用戶端,最後兩個協定位于MapReduce内部。這裡使用的getNewJobId方法即協定JobSubmissionProtocol所定義:

使用者使用該協定通過JobTracker送出作業,檢視作業狀态等。

2. 作業檔案上傳

JobClient會根據作業配置資訊将作業所需檔案上傳到JobTracker的檔案系統,通常是HDFS。配置資訊由JobConf類對象維護。在新的API中,JobConf對象作為JobContext對象的組成部分,作業類Job即繼承于JobContext類。

在上傳檔案前,需要在HDFS上建立必要的目錄。上傳檔案的具體過程從 JobClient.submitJobInternal方法中這句調用開始:

在配置了送出副本數(mapred.submit.replication,預設為10)等資訊後,主要代碼分析如下(為了清晰起見,省略了一些日志和異常處理):

首先,從配置中擷取不同類型檔案的名稱和路徑,這些配置在作業送出時從指令行(Hadoop Shell)指定。files表示作業依賴的普通檔案,比如文本檔案;libjars表示應用程式依賴的第三方jar包;archives表示應用程式使用的多個檔案打包而成的壓縮檔案。

接下來,在JobTracker的檔案系統(通常為HDFS)的命名空間建立一系列檔案路徑名,其中包括前述三種檔案類型。

有了路徑名後,在HDFS上建立路徑并将這些檔案拷貝到對應的目錄中,代碼如下:

注意,MapReduce作業檔案的上傳和下載下傳是通過DistributedCache工具完成的,它是一個資料分發工具。使用者指定的檔案會被分發到各個TaskTracker上以運作Task。這裡暫不涉及該工具的細節,留待日後讨論。

最後,将作業對應的jar檔案拷貝到HDFS中:

注意,在每次上傳一種類型的檔案後,都會将這種檔案的路徑配置到JobConf對象中,具體的工作由

這四行代碼完成。順便提一句,Path類Hadoop檔案系統在java.net.URI的基礎上抽象了檔案系統中的路徑 【3】 。Java的File類和URL類分别抽象了不同的事物,Path可以說将二者統一起來。

3. 生成InputSplit檔案

JobClient調用InputFormat的getSplits方法将使用者送出的輸入檔案生成InputSplit相關資訊。

jobCopy是一個JobConf對象。其中,writeSplits方法會實際調用InputSplit.getSplits方法生成splits資訊,并将splits原始資訊和元資訊寫入HDFS對應的目錄和檔案中。有關split的生成過程日後研究,這裡不展開了。最後,将作業對應的JobConf對象以XML配置檔案形式寫入到HDFS中:

至此,作業檔案上傳才算正式完畢。

接下來,作業将被送出到JobTracker,請關注下篇文章:

MapReduce排程與執行原理之作業初始化

上一篇: h5實體
下一篇: h5拖放

繼續閱讀