如何run()通过Hadoop框架调用mapper或reducer类的方法?框架正在调用run()方法,但它需要一个上下文对象,那么Hadoop如何传递该对象?该对象中包含哪些信息?
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类作为主要入口类。
| 归档时间: |
|
| 查看次数: |
7627 次 |
| 最近记录: |