6

这可能表明我缺乏对 Java 的理解,但我想知道为什么在大多数 MapReduce 程序中,mapper 和 reducer 类被声明为静态的?

4

2 回答 2

15

当将 mapper 和 reducer 类声明为另一个类的内部类时,必须将它们声明为 static,以便它们不依赖于父类。

Hadoop 使用反射为每个运行的 map 或 reduce 任务创建类的实例。创建的新实例需要一个零参数构造函数(否则它怎么知道要传递什么)。

通过在没有 static 关键字的情况下声明内部映射器或 reduce 类,java 编译器实际上创建了一个构造函数,该构造函数期望在构造时传入父类的实例。

您应该能够通过对生成的类文件运行 javap 命令来看到这一点

此外,在父类声明中使用 static 关键字时无效(这就是为什么您永远不会在顶层看到它,而只会在子类中看到它)

于 2012-07-20T01:44:20.857 回答
1

我可以想到两个原因:

  1. 在执行 map-reduce 方法时,不需要必须在对象中保留的状态。因此,所有必要的信息都传递给该方法,无需在对象中存储额外的数据。如果对象的生命周期不会超过一次方法调用,那么为什么还要与实例化作斗争呢?
  2. 拥有多个对象是没有意义的,这与实现Singleton Pattern的原因类似。
于 2012-07-19T23:20:14.463 回答