为什么将Mapper和Reducer类声明为静态?

时间:2012-07-19 23:15:02

标签: java hadoop mapreduce

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

2 个答案:

答案 0 :(得分:15)

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

Hadoop使用反射为每个地图创建一个类的实例,或者减少运行的任务。创建的新实例需要一个零参数构造函数(否则它将如何知道要传递的内容)。

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

您应该可以通过对生成的类文件运行javap命令来查看此内容

此外,static关键字在父类声明中使用时无效(这就是为什么你从未在顶层看到它,但只在子类中看到它)

答案 1 :(得分:1)

我可以想到两个原因:

  1. 执行map-reduce方法时,不需要状态,必须在对象中保留。因此,所有必要的信息都传递给方法,不需要在对象中存储额外的数据。如果对象的生命周期不会超过一个方法调用,为什么要在实例化时挣扎呢?
  2. 拥有多个对象是没有意义的,您实施Singleton Pattern的原因类似。