Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么要将Mapper和Reducer类声明为静态类?_Java_Hadoop_Mapreduce - Fatal编程技术网

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

Java 为什么要将Mapper和Reducer类声明为静态类?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,这可能表明我对Java缺乏理解,但我想知道为什么在大多数MapReduce程序中,mapper和reducer类被声明为静态的 我可以想到两个原因: 执行映射缩减方法时,不需要在对象中保留状态。因此,所有必要的信息都被传递给方法,而不需要在对象中存储额外的数据。如果对象的生存期不会超过一个方法调用,那么您为什么要为实例化而挣扎呢 拥有一个以上的对象是没有意义的,类似于您将实现的原因 当将mapper和reducer类声明为另一个类的内部类时,必须将它们声明为静态的,以便它们不依赖于父类 Hado

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

我可以想到两个原因:

  • 执行映射缩减方法时,不需要在对象中保留状态。因此,所有必要的信息都被传递给方法,而不需要在对象中存储额外的数据。如果对象的生存期不会超过一个方法调用,那么您为什么要为实例化而挣扎呢
  • 拥有一个以上的对象是没有意义的,类似于您将实现的原因

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

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

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

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


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

    谢谢。实际上,你关于反射的解释解决了我遇到的其他一些问题。@Chris White你很和蔼可亲。这是不正确的-在map reduce中,创建了Mapper类的几个具体实例;而且他们确实可以保持状态。我猜“静态”在Java和C#中的含义是不同的。