Java Hadoop中的映射器和还原器必须是静态类吗?
我尝试在Hadoop中做一些简单的事情,发现在编写映射器和还原器时,映射器和还原器到处都是静态的。我的任务将分解为几个Java Hadoop中的映射器和还原器必须是静态类吗?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我尝试在Hadoop中做一些简单的事情,发现在编写映射器和还原器时,映射器和还原器到处都是静态的。我的任务将分解为几个map部分和最后一个reduce。如果我想在其他工作中重复使用我的一个制图器,该怎么办?如果我将映射器类定义为internalstaticone,我可以在其他作业中使用它吗?此外,非琐碎的问题可能需要更多复杂的映射程序,因此在维护时,将它们全部放在一个巨大的文件中会变得很糟糕 除了作业本身,还有什么方法可以将映射器和还原器作为常规类(甚至可能在单独的jar中)?您的问题是,类必须
map
部分和最后一个reduce
。如果我想在其他工作中重复使用我的一个制图器,该怎么办?如果我将映射器类定义为internalstatic
one,我可以在其他作业中使用它吗?此外,非琐碎的问题可能需要更多复杂的映射程序,因此在维护时,将它们全部放在一个巨大的文件中会变得很糟糕
除了作业本身,还有什么方法可以将映射器和还原器作为常规类(甚至可能在单独的jar中)?您的问题是,类必须是静态的、可能是静态的、可能是内部的,还是应该是内部的 Hadoop本身需要能够通过反射实例化
映射器
或还原器
,给定作业
中配置的类引用/名称。如果它是一个非静态的内部类,这将失败,因为实例只能在Hadoop可能一无所知的其他类的上下文中创建。(我想,除非内部类扩展其封闭类。)
所以要回答第一个问题:它不应该是非静态的,因为这几乎肯定会使它无法使用。回答第二个和第三个问题:它可以是一个静态(内部)类
对我来说,Mapper
或Reducer
显然是一个顶级概念,值得一个顶级类。有些人喜欢让它们内部静态,以便与“Runner”类配对。我不喜欢这个,因为它确实是子包的用途。您需要注意另一个设计原因来避免这种情况。对于第四个问题:不,我认为内部课程不是好的实践
最后一个问题:是的,
Mapper
和Reducer
类可以在单独的JAR文件中。告诉Hadoop哪些JAR文件包含所有这些代码,这就是它将发送给工作人员的文件。工人们不需要你的工作
。然而,他们需要映射器
和还原器
在同一个罐子中依赖的任何东西。我觉得上面的答案非常精确,并且满足了基本原理。除此之外,我觉得在创建map和reduce时应该利用内部类。依我看,所有的代码都应该放在一个地方
泛型可以在单个类中经过深思熟虑地使用,以确保没有打字错误。这不是一个答案。如果你有足够的声誉,你可以留下评论。