hadoop輸入的處理類
網絡
InputFormatapp
InputFormat負責處理MR的輸入部分。函數
做用:oop
一、驗證做業的輸入是否規範。性能
二、把輸入文件切分紅InputSplit。優化
三、提供RecordReader的實現類,把InputSplit讀到Mapper中進行處理。spa
FileInputFormat設計
FileInputFormat是全部以文件做爲數據源的InputFormat實現的基類,FileInputFormat保存爲Job輸入的全部文件,並實現了對輸入文件計算splits的方法。至於得到記錄的方法是由不一樣的子類---TextInputFormat進行實現的。orm
TextInputFormatip
默認的處理類,處理普通文本文件。
文件中每一行做爲一個記錄,他將每一行在文件中的起始偏移量做爲key,每一行的內容做爲value,默認以\n或回車鍵做爲一行記錄。
注意:TextInputFormat集成了FileInputFormat。
InputSplit
在執行MapReduce以前,原始數據被分割成若干Split,每一個Split做爲一個Map任務的輸入,在Map執行過程當中Split會被分解成一個個記錄(key-value鍵值對),Map會依次處理每個記錄。
Hadoop將MapReduce的輸入數據劃分紅等長的小數據塊,稱爲輸入分片(InputSplit)或簡稱分片。
Hadoop爲每一個分片構建一個Map任務,並由該任務來運行用戶自定義的Map函數從而處理分片中的每條記錄。
Hadoop在存儲有輸入數據(HDFS中的數據)的節點運行Map任務,能夠得到最佳性能。這就是所謂的數據本地化優化。
最佳分片的大小應該與塊大小相同:
由於它是確保能夠存儲在單個節點上的最大輸入塊的大小。若是分片跨越2個數據塊,那麼對於任何一個HDFS節點,基本上都不可能同時存儲着2個數據塊,所以分片中的部分數據須要經過網絡傳輸到Map任務節點,。與使用本地數據運行整個Map任務相比,這種方法顯然效率更低。
其餘輸入類
CombineFileInputFormat
相對於大量的小文件來講,Hadoop更合適處理少許的大文件。
CombineFileInputFormat能夠緩解這個問題,它是針對小文件而設計的。
KeyValueTextInputFormat
當輸入數據的每一行是兩列,並用Tab分離的形式的時候,KeyValueTextInputFormat處理這種格式的文件很是適合。
NlineInputFormat
能夠控制在每一個Split中數據的行數。
SequenceFileInputFormat
當輸入文件格式是SequenceFile的時候,要使用SequenceFileInputFormat做爲輸入。
自定義輸入格式
一、集成FileInputFormat基類;
二、重寫getSplits(JobContext context)方法;
三、重寫createRecordReader(InputSplit split,TaskAttemptContext context)方法;
Hadoop輸出的處理類
TextOutputFormat
默認的輸出格式,key和value中間值用Tab隔開的。
SequenceFileOutputFormat
將key和value以sequence格式輸出。
SequenceFileAsOutputFormat
將key和value以原始二進制的格式輸出。
MapFileOutputFormat
將key和value寫入MapFile中,因爲MapFile中的key是有序的,因此寫入的時候必須保證記錄是按Key值順序寫入的。
MultipleOutputFormat
默認狀況下一個Reduce會產生一個輸出,可是有些時候咱們想一個Reduce產生多個輸出,MultipleOutputFormat和MultipleOutputs能夠實現這個功能。
Name:Xr
Date:2014-03-01 22:02