首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hadoop中的Mappers和Reducer必须是静态类吗?

Hadoop中的Mappers和Reducer必须是静态类吗?
EN

Stack Overflow用户
提问于 2013-02-12 16:10:45
回答 2查看 2.5K关注 0票数 5

我试图在Hadoop中做一些简单的事情,并发现在编写映射器和缩减程序时,到处都定义为静态的。我的任务将被分解成几个map部分和一个最终的reduce。如果我想在其他工作中重用我的一个映射器怎么办?如果我将我的映射器类定义为内部static,我可以在其他工作中使用它吗?此外,非平凡的问题可能需要更多更复杂的映射器,所以在维护时将它们放在一个巨大的文件中会变得很糟糕。

有没有办法让映射器和缩减程序作为常规类(甚至可能在单独的jar中)而不是作业本身?

EN

回答 2

Stack Overflow用户

发布于 2013-02-12 16:19:43

你的问题是类是否必须是静态的,可能是静态的,或者可能是内部的,或者应该是内部的?

给定Job中配置的类引用/名称,Hadoop本身需要能够通过反射实例化您的MapperReducer。如果它是一个非静态内部类,这将会失败,因为一个实例只能在你的一些其他类的上下文中创建,而这些类可能是Hadoop所不知道的。(我想,除非内部类扩展了它的封闭类。)

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

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

最后一个问题:是的,MapperReducer类可以在单独的JAR文件中。您告诉Hadoop哪个JAR文件包含所有这些代码,这就是它将发送给工作人员的文件。员工不需要你的Job。但是,它们需要在同一个JAR中包含MapperReducer所依赖的任何内容。

票数 8
EN

Stack Overflow用户

发布于 2014-04-30 22:20:19

我觉得上面的答案是非常精确的,确实满足了理论基础。除了,我觉得在创建map和reduce时应该利用内部类。国际海事组织,所有的代码应该放在一个地方。

泛型可以在单个类中充分利用,确保没有类型转换错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14828131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档