Hadoop權威指南: InputFormat,RecordReader,OutputFormat和RecordWriter


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處理整個文件,造成潛在的巨大性能損失


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM