MapReduce的輸入處理類

MapReduce輸入的處理類

FileInputFormat是所有以文件作爲數據源的InputFormat實現的基類,FileInputFormat保存作爲job輸入的所有文件,並

實現了對輸入文件計算splits的方法。至於獲得記錄的方法是有不同的子類——TextInputFormat進行實現的。


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

有三個作用:

驗證作業的輸入是否規範.

把輸入文件切分成InputSplit.

提供RecordReader 的實現類,把InputSplit讀到Mapper中進行處理.


在執行mapreduce之前,原始數據被分割成若干split,每個split作爲一個map任務的輸入,在map執行過程中split會被

分解成一個個記錄(key-value對),map會依次處理每一個記錄。

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

一部分.               

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

的原因。

◆    當Hadoop處理很多小文件(文件大小小於hdfs block大小)的時候,由於FileInputFormat不會對小文件進行劃

分,所以每一個小文件都會被當做一個split並分配一個map任務,導致效率底下。

 例如:一個1G的文件,會被劃分成16個64MB的split,並分配16個map任務處理,而10000個100kb的文件會被

10000個map任務處理。


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

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

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

◆  TextInputFormat繼承了FileInputFormat。


MapReduce其他輸入類

◆    DBInputFormat

◆    CombineFileInputFormat

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

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

◆    KeyValueTextInputFormat

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

合。

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

輸入類——NLineInputformat

在啓動job之前需設置:


//設置具體輸入處理類
job.setInputFormatClass(NLineInputFormat.class);
//設置每個split的行數
NLineInputFormat.setNumLinesPerSplit(job, Integer.parseInt(args[2]));

輸入類—KeyValueTextInputFormat

如果行中有分隔符,那麼分隔符前面的作爲key,後面的 作爲value;如果行中沒有分隔符,那麼整行作爲key,value

爲空

job.setInputFormatClass(KeyValueTextInputFormat.class);

//默認分隔符就是製表符

//conf.setStrings(KeyValueLineRecordReader.KEY_VALUE_SEPERATOR, "\t");

需要注意使用KeyValueTextInputFormat時,mapper函數的形參K1 V1的類型都是Text。


◆    SequenceFileInputformat 

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






發佈了84 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章