下面介紹MapReduce的主要的六個類,只有了解了這六個類的作用,才能在編寫程序中知道哪個類是要自己實現,哪些類可以調用默認的類,才能真正的做到游刃有余,關於需要自己編寫的類(用戶制定類)可以參考:http://www.cnblogs.com/liqizhou/archive/2012/05/14/2499498.html
- InputFormat類。該類的作用是將輸入的文件和數據分割成許多小的split文件,並將split的每個行通過LineRecorderReader解析成<Key,Value>,通過job.setInputFromatClass()函數來設置,默認的情況為類TextInputFormat,其中Key默認為字符偏移量,value是該行的值。
- Map類。根據輸入的<Key,Value>對生成中間結果,默認的情況下使用Mapper類,該類將輸入的<Key,Value>對原封不動的作為中間按結果輸出,通過job.setMapperClass()實現。實現Map函數。
- Combine類。實現combine函數,該類的主要功能是合並相同的key鍵,通過job.setCombinerClass()方法設置,默認為null,不合並中間結果。實現map函數
- Partitioner類。 該該主要在Shuffle過程中按照Key值將中間結果分成R份,其中每份都有一個Reduce去負責,可以通過job.setPartitionerClass()方法進行設置,默認的使用hashPartitioner類。實現getPartition函數
- Reducer類。 將中間結果合並,得到中間結果。通過job.setReduceCalss()方法進行設置,默認使用Reducer類,實現reduce方法。
- OutPutFormat類,該類負責輸出結果的格式。可以通過job.setOutputFormatClass()方法進行設置。默認使用TextOUtputFormat類,得到<Key,value>對。
note:hadoop主要是上面的六個類進行mapreduce操作,使用默認的類,處理的數據和文本的能力很有限,具體的項目中,用戶通過改寫這六個類(重載六個類),完成項目的需求。說實話,我剛開始學的時候,我懷疑過Mapreudce處理數據功能,隨着學習深入,真的很欽佩mapreduce的設計,基本就二個函數,通過重載,可以完成所有你想完成的工作。
public static void main(String[] args)throws IOException { Configuration conf = new Configuration(); Job job = new Job(conf); job.setInputFormatClass(TextInputFormat.class); job.setMapperClass(Mapper.class); job.setCombinerClass(null); job.setPartitionerClass(HashPartitioner.class); job.setReducerClass(Reducer.class); job.setOutputFormatClass(TextOutFormat.class); } }
作者:BIGBIGBOAT/Liqizhou