【问题标题】:Do Mappers and Reducers in Hadoop have to be static classes?Hadoop 中的 Mappers 和 Reducers 必须是静态类吗?
【发布时间】:2014-04-30 22:47:56
【问题描述】:

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

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

【问题讨论】:

    标签: java hadoop mapreduce


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这不是答案。如果您获得足够的声誉,您可以发表评论。
      猜你喜欢
      • 1970-01-01
      • 2017-04-11
      • 2018-11-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 2015-03-26
      相关资源
      最近更新 更多