Hadoop Mapper Context对象

时间:2013-05-02 11:54:09

标签: hadoop

Hadoop框架如何调用mapper或reducer类的run()方法?框架调用run()方法,但它需要一个上下文对象,那么Hadoop如何传递该对象?该对象中包含哪些信息?

2 个答案:

答案 0 :(得分:3)

将使用Java运行时多态性(即方法重写)调用run()方法。正如您在下面的链接中看到的第569行,扩展的映射器/ reducer将使用Java Reflection API进行实例化。 MapTask类从Job配置对象获取扩展mapper / reducer的名称,客户端程序将使用job.setMapperClass()

配置扩展映射器/ reducer类

以下是取自Hadoop Source MapTask.java

的代码
mapperContext = contextConstructor.newInstance(mapper, job, getTaskID(),
                                                  input, output, committer,
                                                  reporter, split);

   input.initialize(split, mapperContext);
   mapper.run(mapperContext);
   input.close();` 

第#621行是运行时多态的一个例子。在这一行中,MapTask调用已配置映射器的run()方法,并将“Mapper Context”作为参数。如果没有扩展run(),它会调用org.apache.hadoop.mapreduce.Mapper上的run()方法,该方法再次调用已配置映射器上的map()方法。

在上述链接的第616行,MapTask创建了一个上下文对象,其中包含@harpun所提及的作业配置等所有细节,然后传递到#621行的run()方法。

以上解释适用于reduce任务,并且适当的ReduceTask类是主要的入口类。

答案 1 :(得分:0)

是的,在运行map任务尝试时,MR框架会调用映射器的run()方法。就上下文而言,请查看Mapper.Context的文档,尤其是已实现的接口及其javadoc,它们为您提供了上下文中包含的信息的完整概述。通过上下文,您可以访问以下数据:

  • 作业信息(作业配置,映射器/缩减器类名,作业名称,工作目录)
  • 当前执行的任务尝试的状态
  • 当前键,值,输入拆分(映射任务特定信息)

当然,Reducer存在类似的上下文对象:Reducer.Context