我是hadoop初学者。我遇到了一个定制的recordreader程序,它一次读取3行数据,并输出一个3行输入给Map器的次数。
我能够理解为什么要使用recordreader,但是当input format类基本上扩展mapreduce.textinputformat类时,我看不出每个inputsplit如何包含3行。据我所知,textinputformat类为每行(每行)发出一个inputsplit。
那么recordreader如何从每个inputsplit中读取3行呢?请有人解释一下这是怎么可能的。提前谢谢!
1条答案
按热度按时间vom3gejh1#
你需要了解
TextInputFormat
找到答案。让我们深入研究代码。我将谈到新的mapreduceapi,但是“旧的”mapredapi非常相似。
正如你所说,从用户的Angular 来看
TextInputFormat
根据一些新行字符将拆分为记录。让我们检查一下实现情况。你可以看到这个班几乎是空的。关键功能是
createRecord
定义为InputFormat
```@Override
public RecordReader<LongWritable, Text> createRecordReader(
InputSplit split,
TaskAttemptContext context
) {
return new LineRecordReader();
}
public void run(Context context) throws IOException, InterruptedException {
setup(context);
while (context.nextKeyValue()) {
map(context.getCurrentKey(), context.getCurrentValue(), context);
}
cleanup(context);
@Override
public boolean nextKeyValue() throws IOException, InterruptedException {
return reader.nextKeyValue();
}