5

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

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

4

2 回答 2

8

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

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

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

对我来说,MapperorReducer显然是一个顶级概念,应该得到顶级课程。有些人喜欢使它们成为内部静态以将它们与“Runner”类配对。我不喜欢这个,因为它确实是子包的用途。您注意到另一个避免这种情况的设计原因。对于第四个问题:不,我认为内部类不是好的做法。

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

于 2013-02-12T08:19:43.130 回答
1

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

并且可以在单个类中谨慎地使用泛型,确保没有类型转换错误。

于 2014-04-30T14:20:18.830 回答