以下是Mapper的source code
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
是否相同?
答案 0 :(得分:4)
是的,输入和输出都是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
的确切位置。