MapReduce

MapReduce是一種分佈式計算模型,由Google提出,主要用於搜索領域,解決海量數據的計算問題.

MR由兩個階段組成:MapReduce,用戶只需要實現map()reduce()兩個函數,即可實現分佈式計算,非常簡單。

這兩個函數的形參是keyvalue對,表示函數的輸入信息。



◆執行步驟:

 1. map任務處理

1.1讀取輸入文件內容,解析成key、value對。對輸入文件的每一行,解析成key、value對。每一個鍵值對調用一次map函數。

1.2寫自己的邏輯,對輸入的key、value處理,轉換成新的key、value輸出。

1.3對輸出的key、value進行分區。

1.4對不同分區的數據,按照key進行排序、分組。相同key的value放到一個集合中。

1.5 (可選)分組後的數據進行歸約。

2.reduce任務處理

2.1對多個map任務的輸出,按照不同的分區,通過網絡copy到不同的reduce節點。

2.2對多個map任務的輸出進行合併、排序。寫reduce函數自己的邏輯,對輸入的key、value處理,轉換成新的key、value輸出。

2.3把reduce的輸出保存到文件中。


最小的MapReduce驅動

Configuration configuration = new Configuration();

Job job = newJob(configuration, "HelloWorld");

job.setInputFormat(TextInputFormat.class);

job.setMapperClass(IdentityMapper.class);

job.setMapOutputKeyClass(LongWritable.class);

job.setMapOutputValueClass(Text.class);

job.setPartitionerClass(HashPartitioner.class);

job.setNumReduceTasks(1);

job.setReducerClass(IdentityReducer.class);

job.setOutputKeyClass(LongWritable.class);

job.setOutputValueClass(Text.class);

job.setOutputFormat(TextOutputFormat.class);

job.waitForCompletion(true);


FileInputFormat是所有以文件作爲數據源的InputFormat實現的基類,FileInputFormat保存作爲job輸入的所有文件,並實現了對輸入文件計算splits的方法。至於獲得記錄的方法是有不同的子類——TextInputFormat進行實現的。 

InputFormat負責處理MR的輸入部分.

有三個作用:

v驗證作業的輸入是否規範.
v把輸入文件切分成InputSplit.
v提供RecordReader的實現類,把InputSplit讀到Mapper中進行處理.

◆   在執行mapreduce之前,原始數據被分割成若干split,每個split作爲一個map任務的輸入,在map執行過程中split會被分解成一個個記錄(key-value對),map會依次處理每一個記錄。

◆   FileInputFormat只劃分比HDFS block大的文件,所以FileInputFormat劃分的結果是這個文件或者是這個文件中的一部分.               

◆   如果一個文件的大小比block小,將不會被劃分,這也是Hadoop處理大文件的效率要比處理很多小文件的效率高的原因。

◆    Hadoop處理很多小文件(文件大小小於hdfs block大小)的時候,由於FileInputFormat不會對小文件進行劃分,所以每一個小文件都會被當做一個split並分配一個map任務,導致效率底下。


◆  TextInputformat是默認的處理類,處理普通文本文件。

◆  文件中每一行作爲一個記錄,他將每一行在文件中的起始偏移量作爲key,每一行的內容作爲value

◆  默認以\n或回車鍵作爲一行記錄。

◆  TextInputFormat繼承了FileInputFormat


◆    CombineFileInputFormat

       相對於大量的小文件來說,hadoop更合適處理少量的大文件。

        CombineFileInputFormat可以緩解這個問題,它是針對小文件而設計的。

◆    KeyValueTextInputFormat

        當輸入數據的每一行是兩列,並用tab分離的形式的時候,KeyValueTextInputformat處理這種格式的文件非常適合。

◆    NLineInputformat 
       
NLineInputformat可以控制在每個split中數據的行數。

◆    SequenceFileInputformat 

        當輸入文件格式是sequencefile的時候,要使用SequenceFileInputformat作爲輸入。


◆    TextOutputformat

       默認的輸出格式,keyvalue中間值用tab隔開的。

◆    SequenceFileOutputformat

       keyvaluesequencefile格式輸出。

◆    SequenceFileAsOutputFormat

       keyvalue以原始二進制的格式輸出。

◆    MapFileOutputFormat

       keyvalue寫入MapFile中。由於MapFile中的key是有序的,所以寫入的時候必須保證記錄是按key值順序寫入的。

◆    MultipleOutputFormat

        默認情況下一個reducer會產生一個輸出,但是有些時候我們想一個reducer產生多個輸出,MultipleOutputFormatMultipleOutputs可以實現這個功能。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章