Hadoop框架如何调用mapper或reducer类的run()
方法?框架调用run()
方法,但它需要一个上下文对象,那么Hadoop如何传递该对象?该对象中包含哪些信息?
答案 0 :(得分:3)
将使用Java运行时多态性(即方法重写)调用run()方法。正如您在下面的链接中看到的第569行,扩展的映射器/ reducer将使用Java Reflection API进行实例化。 MapTask类从Job配置对象获取扩展mapper / reducer的名称,客户端程序将使用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调用已配置映射器的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。