Hadoop教程:Hadoop基本流程和代碼范例
基本流程:


一個圖片太大了,只好分割成為兩部分。根據流程圖來說一下具體的一個任務執行的情況。
1. 分布式環境中客戶端創建任務并提交。
2. InputFormat做Map前的預處理,主要負責以下工作:
a) 驗證輸入的格式是否符合JobConfig的輸入定義,這個在實現Map和構建Conf的時候就會知道,不定義可以是Writable的任意子類。
b) 將input的文件split為邏輯上的輸入InputSplit,其實這就是在上面提到的在分布式文件系統中blocksize是有大小限制的,因此大文件會被劃分為多個block。
c) 通過RecordReader來再次處理inputsplit為一組records,輸出給Map。(inputsplit只是邏輯切分的第一步,但是如何根據文件中的信息來切分還需要RecordReader來實現,例如最簡單的默認方式就是回車換行的切分)
3. RecordReader處理后的結果作為Map的輸入,Map執行定義的Map邏輯,輸出處理后的key,value對到臨時中間文件。
4. Combiner可選擇配置,主要作用是在每一個Map執行完分析以后,在本地優先作Reduce的工作,減少在Reduce過程中的數據傳輸量。
5. Partitioner可選擇配置,主要作用是在多個Reduce的情況下,指定Map的結果由某一個Reduce處理,每一個Reduce都會有單獨的輸出文件。(后面的代碼實例中有介紹使用場景)
6. Reduce執行具體的業務邏輯,并且將處理結果輸出給OutputFormat。
7. OutputFormat的職責是,驗證輸出目錄是否已經存在,同時驗證輸出結果類型是否如Config中配置,最后輸出Reduce匯總后的結果。
代碼范例:
業務場景描述:
可設定輸入和輸出路徑(操作系統的路徑非HDFS路徑),根據訪問日志分析某一個應用訪問某一個API的總次數和總流量,統計后分別輸出到兩個文件中。
僅僅為了測試,因此沒有去細分很多類,將所有的類都歸并于一個類便于說明問題。

圖4 測試代碼類圖
LogAnalysiser就是主類,主要負責創建,提交任務,并且輸出部分信息。內部的幾個子類用途可以參看流程中提到的角色職責。具體的看看幾個類和方法的代碼片斷:
LogAnalysiser::MapClass
public static class MapClass extends MapReduceBase
implements Mapper<LongWritable, Text, Text, LongWritable>
{
public void map(LongWritable key, Text value, OutputCollector<Text, LongWritable> output, Reporter reporter)
throws IOException
&
來源:代碼農場