簡體   English   中英

mapreduce.TextInputFormat hadoop

[英]mapreduce.TextInputFormat hadoop

我是Hadoop初學者。 我遇到了這個自定義的RecordReader程序, 程序一次讀取3行,並輸出給映射器輸入3行的次數。

我能夠理解為什么使用RecordReader,但是當輸入格式類本質上是擴展mapreduce.TextInputFormat類時,我看不到每個InputSplit如何包含3行。 根據我的理解,TextInputFormat類為每行(對於每個\\ n)發出1 InputSplit。

那么RecordReader如何從每個InputSplit讀取3行? 請有人解釋這是怎么可能的。 提前致謝!

您需要了解TextInputFormat的實現才能找到答案。

讓我們深入研究代碼。 我將談論新的mapreduce API,但“舊的” mapred API非常相似。

如您所說,從用戶的角度來看, TextInputFormat根據一些換行符將拆分拆分為記錄。 讓我們檢查一下實現

您可以看到該類幾乎為空。 關鍵功能是createRecord ,由InputFormat定義

@Override
public RecordReader<LongWritable, Text> createRecordReader(
        InputSplit split, 
        TaskAttemptContext context
) {
   return new LineRecordReader();
}

一般的約定是使用InputFormat獲取RecordReader。 如果您在MapperMapContextImpl內部查看,您將看到該映射器僅使用RecordReader來獲取下一個鍵和值。 他什么都不知道。

映射器:

public void run(Context context) throws IOException, InterruptedException {
  setup(context);
  while (context.nextKeyValue()) {
    map(context.getCurrentKey(), context.getCurrentValue(), context);
  }
  cleanup(context);

}

MapContextImpl:

@Override
public boolean nextKeyValue() throws IOException, InterruptedException {
  return reader.nextKeyValue();
}

現在,請仔細閱讀您提供的此鏈接。 您將看到:

  • NLinesInputFormat擴展了TextInputFormat並且僅覆蓋createRecordReader 基本上,使用LineReader可以提供自己的RecordReader 您想擴展TextInputFormat而不是擴展層次結構中更高的另一個類,因為它已經處理了在此級別上完成的所有事情,並且您可能需要(壓縮,不可拆分格式等)。
  • NLinesRecordReader做真正的工作。 initialize它做了什么工作,才能從提供的InputSplit的正確偏移處獲取InputStream 它還創建一個LineReader ,與TextInputFormat所使用的相同
  • nextKeyValue方法中,您將看到LineReader.readLine()被調用三次以獲得三行(加上一些邏輯來正確處理一些LineReader.readLine()情況,例如太大的記錄,行尾,拆分尾)

希望對您有幫助。 關鍵是要了解API的總體設計以及每個部分之間如何交互。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM