hadoop處理的輸入資料通常很大,以GB或TB計。hadoop將大檔案分割為多個塊(分區、Input split),分別存在多個機器上。這樣,當需要分析此大檔案時,MapReduce程式在多台機器上平行處理。
分區不能太大,如果所有資料在一個分區內,那就無法平行處理;
分區不能太小,啟動和停止每個分區也需要消耗時間。
HDFS使用FSDataInputStream讀取檔案,提供了隨機讀功能。
Mapper
Reducer
Partitioner
對於指定的Key和Value,選擇對應的Reducer。
並不是整個MapReduce程式只有一個Reducer。
Combiner
在Mapper本地進行一次reduce操作
InputFormat
分割和讀取檔案的方式
HDFS提供的常用的:
TextInputFormat:
KeyValueTextInputFormat:
SequenceFileInputFormat:
NLineInputFormat:
也可以實現自己的InputFormat,只需實現兩個方法:
getSplits:分割成多個輸入分區,每個map任務分配一個分區。
getRecordReader:順序讀取指定分區中的所有記錄,解析出Key和Value。
通常繼承自FileInputFormat,已經實現了getSPlits,只需自己實現RecordReader即可。
OutputFormat
當MapReduce處理檔案結束後,需要每個reducer把自己的輸出寫入到各自的檔案裡。
輸出檔案放在一個公用目錄中,命名為part-nnnnn,nnnnn為reducer的分區ID。
相對應的,由RecordWriter對輸出進行格式化。
HDFS提供的常用的:
TextOutputFormat:
SequenceFileOutputFormat:可以再由SequenceFileInputFormat再進行讀取,這樣可以串聯起來,作為中間結果。
NullOutputFormat: