run()
Hadoop框架调用mapper或reducer类的方法是怎样的?框架正在调用该run()
方法,但它需要一个上下文对象,那么 Hadoop 是如何传递该对象的呢?该对象中包含哪些信息?
2 回答
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 类是主要的入口类。
是run()
的,mapper的方法在运行map任务尝试时被MR框架调用。就上下文而言,请查看Mapper.Context的文档,尤其是实现的接口及其 javadocs 为您提供了上下文中包含的信息的完整概述。通过上下文,您可以访问以下数据:
- 作业信息(作业配置、mapper/reducer 类名、作业名、工作目录)
- 当前执行的任务尝试的状态
- 当前键、值、输入拆分(映射任务特定信息)
当然,Reducer 也存在类似的上下文对象:Reducer.Context。