我试图在Hadoop中做一些简单的事情,并发现在编写映射器和缩减程序时,到处都定义为静态的。我的任务将被分解成几个map部分和一个最终的reduce。如果我想在其他工作中重用我的一个映射器怎么办?如果我将我的映射器类定义为内部static,我可以在其他工作中使用它吗?此外,非平凡的问题可能需要更多更复杂的映射器,所以在维护时将它们放在一个巨大的文件中会变得很糟糕。
有没有办法让映射器和缩减程序作为常规类(甚至可能在单独的jar中)而不是作业本身?
发布于 2013-02-12 16:19:43
你的问题是类是否必须是静态的,可能是静态的,或者可能是内部的,或者应该是内部的?
给定Job中配置的类引用/名称,Hadoop本身需要能够通过反射实例化您的Mapper或Reducer。如果它是一个非静态内部类,这将会失败,因为一个实例只能在你的一些其他类的上下文中创建,而这些类可能是Hadoop所不知道的。(我想,除非内部类扩展了它的封闭类。)
所以回答第一个问题:它不应该是非静态的,因为这几乎肯定会使它不可用。回答第二个和第三个问题:它可以是一个静态(内部)类。
对我来说,Mapper或Reducer显然是一个顶级概念,值得一个顶级类。有些人喜欢将它们设置为内部静态,以便与"Runner“类配对。我不喜欢这样,因为这确实是子包的用途。您注意到了避免这种情况的另一个设计原因。对于第四个问题:不,我认为内部类不是好的实践。
最后一个问题:是的,Mapper和Reducer类可以在单独的JAR文件中。您告诉Hadoop哪个JAR文件包含所有这些代码,这就是它将发送给工作人员的文件。员工不需要你的Job。但是,它们需要在同一个JAR中包含Mapper和Reducer所依赖的任何内容。
发布于 2014-04-30 22:20:19
我觉得上面的答案是非常精确的,确实满足了理论基础。除了,我觉得在创建map和reduce时应该利用内部类。国际海事组织,所有的代码应该放在一个地方。
泛型可以在单个类中充分利用,确保没有类型转换错误。
https://stackoverflow.com/questions/14828131
复制相似问题