5

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

4

2 回答 2

3

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

以下是取自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 以“Mapper Context”为参数调用已配置映射器的 run() 方法。如果 run() 没有扩展,它会调用 run() 方法,该方法org.apache.hadoop.mapreduce.Mapper再次调用已配置映射器上的 map() 方法。

在上述链接的第 616 行,MapTask 使用 @harpun 提到的作业配置等的所有详细信息创建上下文对象,然后在第 621 行传递给 run() 方法。

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

于 2013-05-02T16:08:55.680 回答
0

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

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

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

于 2013-05-02T14:06:18.850 回答