基礎環境
Version: Hadoop v3.1.2
Example: MultiFileWordCount.java
先看一下整體的流程圖,之後分析源碼,加深對這張圖的理解以及瞭解圖中一些細節的實現。
由於整個流程涉及的代碼很多,這篇只會分析1-5a提交任務到YARN部分,5b-11會在之後的YARN源碼解析的文章中詳細介紹。
源碼解析
程序入口,可以看到實例化了MultiFileWordCount對象並調用了ToolRunner的run方法,非常簡單。
MultiFileWordCount,繼承了Configured,爲了使用getConf和setConf等Configuration相關的操作。實現了Tool接口,重寫了Tool.run方法。
public class MultiFileWordCount extends Configured implements Tool {
ToolRunner.run
然後就是調用MultiFileWordCount中重寫的run方法:
MyInputFormat.class
在MyInputFormat中實現了createRecordReader方法,實例化了一個CombineFileRecordReader對象,該類可以根據大小合併多個文件塊到一個map讀。
Text.class
設置了輸出的key的類,Text遵循UTF-8,支持序列化和反序列化,並且提供一些compare、getLength等函數。
這個代碼就不貼了,是Hadoop基礎包中的一些函數,有興趣可以去看下org/apache/hadoop/io/Text.java
IntWritable.class
設置了輸出的value的類,封裝了int,包含了compare、write等方法。
同屬於Hadoop基礎包中的一些函數,可以參看org/apache/hadoop/io/IntWritable.java
MapClass.class
map階段實現很簡單,繼承了框架接口Mapper並重寫了map方法。
IntSumReducer.class
reduce階段也非常簡單,繼承了框架接口Reducer並重寫了reduce方法。
job.waitForCompletion
提交MapReduce任務入口。
Job.submit
生成JobSubmitter對象並將Job提交到YARN
JobSubmitter.submitJobInternal
提交Job,核心方法之一,大致分爲以下幾個步驟:
1、校驗該job的input和output相關信息的正確性。
2、計算舒服輸入的分片/map數量(input splits)。
3、設置更新需要公用的job conf
4、把job conf和相關jar包copy到HDFS之前建的MapReduce目錄下。
5、提交job,監聽job狀態。
YARNRunner.submitJob
核心方法是resMgrDelegate.submitApplication(appContext)
YarnClientImpl.submitApplication
總結
以上就是MapReduce提交任務到YARN以及監聽任務狀態的主要代碼了,斷斷續續寫了一週,深刻體會到了Hadoop代碼對一些細節的控制真的非常全面、精簡,讓人看似覺得少考慮了一些情況,但細細一想缺找不出漏洞。
在後續的文章中,會對Hive以及YARN的源碼進行分析Hadoop源碼系列文章目錄。