在MapReduceHadoop的mapper类的run方法中使用context对象?

46scxncf  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(280)

下面是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 用于输入和输出?

mspsb9vt

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 .

相关问题