專家剖析 Hadoop源代碼中的Task類用法
本節(jié)和大家一起學習一下Hadoop源代碼中的Task類,Task是一個虛基類,它有兩個子類:MapTask,ReduceTask,分別對應著Map和Reduce。下面就來看一下本節(jié)的具體介紹吧。
Hadoop源代碼中的類Task
Task是一個虛基類,它有兩個子類:MapTask,ReduceTask,分別對應著Map和Reduce。先從成員變量開始:
首先是和作業(yè)任務相關的信息,包括jobFile,作業(yè)的配置文件;taskId,任務ID,從中可以獲取作業(yè)ID;partition,Job內ID;taskStatus,任務狀態(tài)。jobCleanup,jobSetup和taskCleanup是三個標志位。
接下來是一組和錯誤回復的變量。我們知道,如果在Task執(zhí)行過程中出錯,很有可能是因為輸入有問題,一個常用的策略是在下一次回復性執(zhí)行過程中,忽略這部分輸入,skipRanges,skipping和writeSkipRecs就是用來控制這個行為的。
currentRecStartIndex和currentRecIndexIterator配合,可以得到當前的任務輸入。
conf保存了當前任務的配置(JobConf形式),MapOutputFile上一部分已經介紹了,用于管理臨時文件,跟它配合的是lDirAlloc,類型為LocalDirAllocator,是本地文件分配器。jobContext和taskContext保持了Job和Task的上下文。committer定制了和Task生命周期相關的一些特殊處理(也可以看出是上下文)。
最后一部分應該是輸出outputFormat。
和統(tǒng)計/狀態(tài)監(jiān)視的成員變量分散在類的各處,如spilledRecordsCounter,taskProgress,counters等,我們就不再介紹了。
下面我們開始來進行分析一下Hadoop源代碼中類Task的成員函數,首先是虛方法,Task包含了下面3個虛方法:
publicabstractvoidrun(JobConfjob,TaskUmbilicalProtocolumbilical)
throwsIOException,ClassNotFoundException,InterruptedException;
執(zhí)行Task;
publicabstractTaskRunnercreateRunner(TaskTrackertracker,TaskTracker.TaskInProgresstip)throwsIOException;
創(chuàng)建一個TaskRunner;
publicabstractbooleanisMapTask();
是否是一個Map任務。上面這3個方法自然是和MapTask,ReduceTask相關,也需要它們實現(xiàn)。
Hadoop源代碼中的構造函數很簡單,主要是初始化一些成員函數。initialize也用于初始化成員,它被Task的子類調用,用于子類傳入一些子類中構造的對象。構造函數后面是一系列的setter和getter,還有實現(xiàn)Writable的write和readFields。
localizeConfiguration函數用于將一些和Task相關的信息存放到JobConf里,這也是HadoopMapReduce中重要的參數傳遞方式。
接下來分析的是一系列和Task生命周期相關的函數。
publicvoiddone(TaskUmbilicalProtocolumbilical,TaskReporterreporter)
done被多個方法調用(下圖),用于做結束任務的一些清理工作,步驟如下:
l更新計數器updateCounters();
l如果任務需要提交,設置Taks狀態(tài)為COMMIT_PENDING,并利用TaskUmbilicalProtocol,匯報Task完成,等待提交;然后調用commit提交任務(下面分析)
l設置任務結束標志位;結束Reporter通信線程;
l發(fā)送最后一次統(tǒng)計報告(通過sendLastUpdate方法,很簡單);
l利用TaskUmbilicalProtocol報告結束狀態(tài)(通過sendDone方法,很簡單)。
commit方法被done方法調用,用于等待TaskTracker的可提交信號。通過這種機制,Task可以等待TaskTracker上需要的一些后續(xù)處理,比方說,把Task的結果取走,需要TaskTracker的協(xié)調和確認。commit還會調用org.apache.hadoop.mapreduce.OutputCommitter的commitTask方法,執(zhí)行一些子類需要的commit事件處理。
runJobCleanupTask,runJobSetupTask和runTaskCleanupTask應用在Maptask和ReduceTask的run方法中,用于做一些準備和可能的清除任務。
runJobSetupTask:為建立Job做準備,執(zhí)行狀態(tài)設置,然后調用org.apache.hadoop.mapreduce.OutputCommitter的setupJob,最后通過done,通知TaskTracker任務完成。
runJobCleanupTask:清理Job,包括步驟狀態(tài)設置,更新狀態(tài)到TaskTracker,調用org.apache.hadoop.mapreduce.OutputCommitter的相關方法,通過done,通知TaskTracker任務完成。
runTaskCleanupTask:清理Task任務,和runJobCleanupTask類似。
應該說,這些方法只是提供了一個通用的框架,具體需要的執(zhí)行,在于org.apache.hadoop.mapreduce.OutputCommitter的具體實現(xiàn)。本節(jié)關于Hadoop源代碼中的類Task相關內容介紹完畢。
【編輯推薦】
- 學習筆記 Hadoop集群如何搭建
- Hadoop0.20.2集群配置入門指導手冊
- Hadoop文件系統(tǒng)如何快速安裝?
- Hadoop集群搭建過程中相關環(huán)境配置詳解
- Hadoop完全分布模式安裝實現(xiàn)詳解