下面是mapper的源代码
public void run(Context context) throws IOException, InterruptedException {
setup(context);
while (context.nextKeyValue()) {
map(context.getCurrentKey(), context.getCurrentValue(), context);
}
cleanup(context);
}
}
你可以注意到, context
两者都用于 read
以及 write
. 怎么可能?就是这样 context.getCurrentKey()
以及 context.getCurrentValue()
用于从上下文检索键和值对,并传递给Map函数。是一样的吗 context
用于输入和输出?
1条答案
按热度按时间mspsb9vt1#
是的,一样
context
用于输入和输出。它存储对的引用RecordReader
以及RecordWriter
. 无论何时context.getCurrentKey()
以及context.getCurrentValue()
用于检索键和值对,请求被委托给RecordReader
. 什么时候context.write()
被称为,它被委托给RecordWriter
.请注意
RecordReader
以及RecordWriter
实际上是抽象类。更新:
org.apache.hadoop.mapreduce.Mapper$Context
工具org.apache.hadoop.mapreduce.MapContext
,这又是一个子类org.apache.hadoop.mapreduce.TaskInputOutputContext
看看这个问题的根源org.apache.hadoop.mapreduce.task.MapContextImpl
. 它又是org.apache.hadoop.mapreduce.task.TaskInputOutputContextImpl
看看到底在哪里Context
将输入和输出委托给RecordReader
以及RecordWriter
.