在Map-reduce Hadoop中使用Mapper类的run方法中的context对象?

时间:2014-07-22 03:32:58

标签: hadoop mapreduce

以下是Mapper的source code

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

您可以注意到,contextread同时使用了write。这怎么可能? 即context.getCurrentKey()context.getCurrentValue()用于从上下文中检索键和值对,并传递给map函数。用于输入和输出的context是否相同?

1 个答案:

答案 0 :(得分:4)

是的,输入和输出都是context。它存储对RecordReaderRecordWriter的引用。每当context.getCurrentKey()context.getCurrentValue()用于检索键和值对时,请求都会委托给RecordReader。当context.write()被调用时,它被委托给RecordWriter

请注意,RecordReaderRecordWriter实际上是抽象类。

更新:

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代表输入和输出到RecordReaderRecordWriter的确切位置。