InputFormat和RecordReader
Hadoop提出了InputFormat的概念
org.apache.hadoop.mapreduce包里的InputFormat抽象類提供了如下列代碼所示的兩個方法
public abstract class InputFormat<K, V> {
public abstract List<InputSplit> getSplits(JobContext context);
RecordReader<K, V> createRecordReader(InputSplit split, TaskAttemptContext context);
}
這些方法展示了InputFormat類的兩個功能:
- 將輸入文件切分為map處理所需的split
- 創建RecordReader類, 它將從一個split生成鍵值對序列
RecordReader類同樣也是org.apache.hadoop.mapreduce包里的抽象類
public abstract class RecordReader<Key, Value> implements Closeable {
public abstract void initialize(InputSplit split, TaskAttemptContext context);
public abstract boolean nextKeyValue() throws IOException, InterruptedException;
public abstract Key getCurrentKey() throws IOException, InterruptedException;
public abstract Value getCurrentValue() throws IOException, InterruptedException;
public abstract float getProgress() throws IOException, InterruptedException;;
public abstract close() throws IOException;
}
為每個split創建一個RecordReader實例,該實例調用getNextKeyValue並返回一個布爾值
組合使用InputFormat和RecordReader可以將任何類型的輸入數據轉換為MapReduce所需的鍵值對
InputFormat
Hadoop在org.apache.hadoop.mapreduce.lib.input包里提供了一些InputFormat的實現,有如下.
- FileInputFormat: 這是一個抽象基類,可以作為任何基於文本輸入的父類
- SequenceFileInputFormat: 這是一個高效的二進制文件格式
- TextInputFormat: 它用於普通文本文件
InputFormat並不局限於從文件讀取數據
RecordReader
Hadoop在org.apache.hadoop.mapreduce.lib.input包里也提供了一些常見的RecordReader實現
- LineRecordReader: 這是RecordReader類對文本文件的默認實現,它將行號時為鍵並將該行內容視為值
- SequenceFileRecordReader: 該類從二進制文件SequenceFile讀取鍵值
OutputFormat和RecordWriter
org.apache.hadoop.mapreduce包里的OutputFormat和RecordWriter的子類負責共同寫入作業輸出
如果指定的輸出路徑已經存在,則會導致作業失敗,如果想改變這種情況,需要一個重寫該方法的OutputFormat子類.
OutputFormat
org.apache.hadoop.mapreduce.output包提供了下列OutputFormat類.
- FileOutputFormat: 這是所有基於文件的OutputFormat的基類
- NullOutputFormat: 這是一個虛擬類,它丟棄所有輸出並對文件不做任何寫入
- SequenceFileOutputFormat: 它將輸出寫入二進制SequenceFile
- TextOutputFormat: 它吧輸出寫入到普通文本文件
上述類把他們所需的RecordWriter定義為內部類,因此不存在單獨實現的RecordWriter類
Sequence files
org.apache.hadoop.io包里的SequenceFile類提供了高效的二進制文件格式,他經常用於MapReduce作業的輸出,尤其是當作業的輸出被當做另一個作業的輸入時.Sequence文件有如下優點.
- 作為二進制文件,它們本質上比文本文件更為緊湊
- 他們支持不同層面的可選壓縮,也就是說,可以對每條記錄或整個split進行壓縮
- 該文件可被並行切分處理
大多數二進制文件是無法被切分的,必須以單獨的線性數據流形式讀取,使用這種無法切分的文件作為MapReduce作業的輸入,意味着需要使用一個單獨的mapper處理整個文件,造成潛在的巨大性能損失