mapreduce.textinputformat hadoop

x6h2sr28  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(302)

我是hadoop初学者。我遇到了一个定制的recordreader程序,它一次读取3行数据,并输出一个3行输入给Map器的次数。
我能够理解为什么要使用recordreader,但是当input format类基本上扩展mapreduce.textinputformat类时,我看不出每个inputsplit如何包含3行。据我所知,textinputformat类为每行(每行)发出一个inputsplit。
那么recordreader如何从每个inputsplit中读取3行呢?请有人解释一下这是怎么可能的。提前谢谢!

vom3gejh

vom3gejh1#

你需要了解 TextInputFormat 找到答案。
让我们深入研究代码。我将谈到新的mapreduceapi,但是“旧的”mapredapi非常相似。
正如你所说,从用户的Angular 来看 TextInputFormat 根据一些新行字符将拆分为记录。让我们检查一下实现情况。
你可以看到这个班几乎是空的。关键功能是 createRecord 定义为 InputFormat ```
@Override
public RecordReader<LongWritable, Text> createRecordReader(
InputSplit split,
TaskAttemptContext context
) {
return new LineRecordReader();
}

一般约定是使用inputformat来获取recordreader。如果你往里面看 `Mapper` 以及 `MapContextImpl` 您将看到Map程序仅使用recordreader获取下一个键和值。他什么都不知道。
Map器:

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` 它完成了获得 `InputStream` 从所提供的 `InputSplit` . 它还创建了一个 `LineReader` ,与 `TextInputFormat` 在 `nextKeyValue` 你会看到的 `LineReader.readLine()` 被调用三次以得到三行(加上一些逻辑以正确处理转角情况,如记录过大、行结束、拆分结束)
希望对你有帮助。关键是理解api的总体设计以及每个部分如何相互作用。

相关问题