咱們開始來分析Hadoop MapReduce的內部的運行機制。用戶向Hadoop提交Job(做業),做業在JobTracker對象的控制下執行。Job被分解成爲Task(任務),分發到集羣中,在TaskTracker的控制下運行。Task包括MapTask和ReduceTask,是MapReduce的Map操做和Reduce操做執行的地方。這中任務分佈的方法比較相似於HDFS中NameNode和DataNode的分工,NameNode對應的是JobTracker,DataNode對應的是TaskTracker。JobTracker,TaskTracker和MapReduce的客戶端經過RPC通訊,具體能夠參考HDFS部分的分析。 咱們先來分析一些輔助類,首先是和ID有關的類,ID的繼承樹以下: 這張圖能夠看出如今Hadoop的org.apache.hadoop.mapred向org.apache.hadoop.mapreduce遷移帶來的一些問題,其中灰色是標註爲@Deprecated的。ID攜帶一個整型,實現了WritableComparable接口,這代表它能夠比較,並且能夠被Hadoop的io機制串行化/解串行化(必須實現compareTo/readFields/write方法)。JobID是系統分配給做業的惟一標識符,它的toString結果是job_<jobtrackerID>_<jobNumber>。例子:job_200707121733_0003代表這是jobtracker200707121733(利用jobtracker的開始時間做爲ID)的第3號做業。 做業分紅任務執行,任務號TaskID包含了它所屬的做業ID,同時也有任務ID,同時還保持了這是不是一個Map任務(成員變量isMap)。任務號的字符串表示爲task_<jobtrackerID>_<jobNumber>_[m|r]_<taskNumber>,如task_200707121733_0003_m_000005表示做業200707121733_0003的000005號任務,改任務是一個Map任務。 一個任務有可能有多個執行(錯誤恢復/消除Stragglers等),因此必須區分任務的多個執行,這是經過類TaskAttemptID來完成,它在任務號的基礎上添加了嘗試號。一個任務嘗試號的例子是attempt_200707121733_0003_m_000005_0,它是任務task_200707121733_0003_m_000005的第0號嘗試。 JVMId用於管理任務執行過程當中的Java虛擬機,咱們後面再討論。 爲了使Job和Task工做,Hadoop提供了一系列的上下文,這些上下文保存了Job和Task工做的信息。 處於繼承樹的最上方是org.apache.hadoop.mapreduce.JobContext,前面咱們已經介紹過了,它提供了Job的一些只讀屬性,兩個成員變量,一個保存了JobID,另外一個類型爲JobConf,JobContext中除了JobID外,其它的信息都保持在JobConf中。它定義了以下配置項: l mapreduce.inputformat.class:InputFormat的實現apache l mapreduce.map.class:Mapper的實現微信 l mapreduce.combine.class: Reducer的實現app l mapreduce.reduce.class:Reducer的實現oop l mapreduce.outputformat.class: OutputFormat的實現spa l mapreduce.partitioner.class: Partitioner的實現orm 同時,它提供方法,使得經過類名,利用Java反射提供的Class.forName方法,得到類對應的Class。org.apache.hadoop.mapred的JobContext對象比org.apache.hadoop.mapreduce.JobContext多了成員變量progress,用於獲取進度信息,它類型爲JobConf成員job指向mapreduce.JobContext對應的成員,沒有添加任何新功能。JobConf繼承自Configuration,保持了MapReduce執行須要的一些配置信息,它管理着46個配置參數,包括上面mapreduce配置項對應的老版本形式,如mapreduce.map.class 對應mapred.mapper.class。這些配置項咱們在使用到它們的時候再介紹。 org.apache.hadoop.mapreduce.JobContext的子類Job前面也已經介紹了,後面在討論系統的動態行爲時,再回來看它。 TaskAttemptContext用於任務的執行,它引入了標識任務執行的TaskAttemptID和任務狀態status,並提供新的訪問接口。org.apache.hadoop.mapred的TaskAttemptContext繼承自mapreduce的對應版本,只是增長了記錄進度的progress。 |
更多精彩內容請關注:http://bbs.superwu.cn 對象
關注超人學院微信二維碼:繼承