Hadoop Mapper Context对象

Jay*_*hav 5 hadoop

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

Nir*_*rvi 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();` 
Run Code Online (Sandbox Code Playgroud)

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

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

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