Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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 Hadoop中的映射器和还原器必须是静态类吗?_Java_Hadoop_Mapreduce - Fatal编程技术网

Java Hadoop中的映射器和还原器必须是静态类吗?

Java Hadoop中的映射器和还原器必须是静态类吗?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我尝试在Hadoop中做一些简单的事情,发现在编写映射器和还原器时,映射器和还原器到处都是静态的。我的任务将分解为几个map部分和最后一个reduce。如果我想在其他工作中重复使用我的一个制图器,该怎么办?如果我将映射器类定义为internalstaticone,我可以在其他作业中使用它吗?此外,非琐碎的问题可能需要更多复杂的映射程序,因此在维护时,将它们全部放在一个巨大的文件中会变得很糟糕 除了作业本身,还有什么方法可以将映射器和还原器作为常规类(甚至可能在单独的jar中)?您的问题是,类必须

我尝试在Hadoop中做一些简单的事情,发现在编写映射器和还原器时,映射器和还原器到处都是静态的。我的任务将分解为几个
map
部分和最后一个
reduce
。如果我想在其他工作中重复使用我的一个制图器,该怎么办?如果我将映射器类定义为internal
static
one,我可以在其他作业中使用它吗?此外,非琐碎的问题可能需要更多复杂的映射程序,因此在维护时,将它们全部放在一个巨大的文件中会变得很糟糕


除了作业本身,还有什么方法可以将映射器和还原器作为常规类(甚至可能在单独的jar中)?

您的问题是,类必须是静态的、可能是静态的、可能是内部的,还是应该是内部的

Hadoop本身需要能够通过反射实例化
映射器
还原器
,给定
作业
中配置的类引用/名称。如果它是一个非静态的内部类,这将失败,因为实例只能在Hadoop可能一无所知的其他类的上下文中创建。(我想,除非内部类扩展其封闭类。)

所以要回答第一个问题:它不应该是非静态的,因为这几乎肯定会使它无法使用。回答第二个和第三个问题:它可以是一个静态(内部)类

对我来说,
Mapper
Reducer
显然是一个顶级概念,值得一个顶级类。有些人喜欢让它们内部静态,以便与“Runner”类配对。我不喜欢这个,因为它确实是子包的用途。您需要注意另一个设计原因来避免这种情况。对于第四个问题:不,我认为内部课程不是好的实践


最后一个问题:是的,
Mapper
Reducer
类可以在单独的JAR文件中。告诉Hadoop哪些JAR文件包含所有这些代码,这就是它将发送给工作人员的文件。工人们不需要你的
工作
。然而,他们需要
映射器
还原器
在同一个罐子中依赖的任何东西。

我觉得上面的答案非常精确,并且满足了基本原理。除此之外,我觉得在创建map和reduce时应该利用内部类。依我看,所有的代码都应该放在一个地方


泛型可以在单个类中经过深思熟虑地使用,以确保没有打字错误。

这不是一个答案。如果你有足够的声誉,你可以留下评论。