2013-05-02 57 views
5

Hadoop框架调用的mapper或reducer类的run()方法如何?该框架调用run()方法,但它需要一个上下文对象,那么Hadoop如何传递该对象?什么信息存在于那个对象中?Hadoop映射器上下文对象

回答

3

run()方法将使用Java运行时多态(称为方法重写)来调用。正如您可以在下面的链接中看到#569行,扩展映射器/缩减器将使用Java Reflection 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()未被扩展,它会调用org.apache.hadoop.mapreduce.Mapper上的run()方法,该方法再次在配置的映射器上调用map()方法。

在上述链路的线路#616,MapTask创建具有工作配置等的所有细节的上下文对象作为由@harpun提及并然后传递到run()方法在线路#621

上面的解释适用于减少任务以及相应的ReduceTask类作为主要入门级。

+0

感谢niranjan可以在你运行任何简单的工作时解释所有hadoop框架类的执行情况? – 2013-05-03 04:42:13

+0

这不是一个简单的答案。有很多hadoop框架类参与其中,在扩展类被调用之前,真正的整个软件层都被执行了。我建议下载并将hadoop源文件附加到IDE中,然后调试任何作业以了解调用堆栈中使用的高级类。 – 2013-05-06 15:15:45

+0

@NiranjanSarvi,你能告诉我们MapTask类是如何创建其他类的上下文类的对象的吗?在MapTask类和Context类之间是否有任何关系,因为在库中Context类是一个抽象类,甚至没有被Maptask类实现?它来自其他方式吗? – Kate 2017-10-22 09:28:03

0

是的,映射程序的run()方法在运行地图任务尝试时由MR框架调用。就上下文而言,请查看Mapper.Context的文档,特别是已实现的接口及其javadoc可以全面了解上下文中包含的信息。通过上下文,你可以访问诸如数据:

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

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