Hadoop作業提交之客戶端作業提交

一、概要描述
僅僅描述向Hadoop提交作業的第一步,即調用Jobclient的submitJob方法,向Hadoop提交作業。

二、 流程描述
Jobclient使用內置的JobSubmissionProtocol 實例jobSubmitClient 和JobTracker交互,最主要是提交作業、獲取作業執行信息等。

在JobClient中作業提交的主要過程如下:

1)通過調用JobTracker的getNewJobId()向jobtracker請求一個新的作業ID
2)獲取job的jar、輸入分片、作業描述等幾個路徑信息,以jobId命名。
3)其中getSystemDir()是返回jobtracker的系統目錄,來放置job相關的文件。包括:mapreduce的jar文件submitJarFile、分片文件submitSplitFile、作業描述文件submitJobFile
4)檢查作業的輸出說明,如果沒有指定輸出目錄或輸出目錄以及存在,則作業不提交。參照org.apache.hadoop.mapreduce.lib.output.FileOutputFormatcheckOutputSpecs方法。如果沒有指定,則拋出InvalidJobConfException,文件已經存在則拋出FileAlreadyExistsException
5)計算作業的輸入分片。通過InputFormat的getSplits(job)方法獲得作業的split並將split序列化封裝爲RawSplit。返回split數目,也即代表有多個分片有多少個map。詳細參見InputFormat獲取Split的方法。
6)writeNewSplits 方法把輸入分片寫到JobTracker的job目錄下。
7)將運行作業所需的資源(包括作業jar文件,配置文件和計算所得的輸入分片)複製到jobtracker的文件系統中一個以作業ID命名的目錄下。
8)使用句柄JobSubmissionProtocol通過RPC遠程調用的submitJob()方法,向JobTracker提交作業。JobTracker作業放入到內存隊列中,由作業調度器進行調度。並初始化作業實例。JobTracker創建job成功後會給JobClient傳回一個JobStatus對象用於記錄job的狀態信息,如執行時間、Map和Reduce任務完成的比例等。JobClient會根據這個JobStatus對象創建一個 NetworkedJob的RunningJob對象,用於定時從JobTracker獲得執行過程的統計數據來監控並打印到用戶的控制檯。

mapreduce 作業提交和執行

mapreduce 作業提交和執行

 

引用下Hadoop: The Definitive Guide, Second Edition中的一張經典圖。這裏僅僅描述上圖中的左上角第一個框部分內容,即本步驟的最終輸出僅僅是將作業提交到JobTracker。其他後續文章會繼續描述。

三、代碼詳細

Jobclient:JobClient是向JobTracker提交作業的接口,可以理解爲Hadoop的Mapreduce作業框架向用戶開放的作業提交入口。可以提交作業,監視作業狀態等

JobSubmissionProtocol(爲什麼0.20.1的javadoc中找不到這個接口,雖然0.20.1 0.20.2代碼中都是相同的用法,知道2.2.0貌似重命名爲被ClientProtocol替換):JobClient和JobTracker進行通信的一個協議。JobClient實際上是用這個句柄來提交鎖業並且監視作業的執行狀況。

這個接口有兩個實現:LocalJobRunner(conf)當mapred-site.xml中的mapred.job.tracker值爲local是爲此對象。表示在單機上執行;如果爲一個地址的話則是JobTracker的對象,表示分佈式執行。

詳細可參照JobClient中 的初始化代碼:

InputFormat重要,但暫不展開(此處會有鏈接)

Split重要,但暫不展開(此處會有鏈接)
RowSplit要,但暫不展開(此處會有鏈接)
通過代碼來了解流程,瞭解如何調用JobClient向Hadoop集羣提交作業。

實際方法的執行是submitJobInternal方法。着重看下這個方法的內部執行。主要的邏輯部分比較詳細的進行了註釋。(有些想繼續展開,感覺太細了,後面的文章中部分重要的會有涉及,不想深度遍歷了,到時會回過頭來互相鏈接)

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