【问题标题】:Hadoop MapReduce: Possible to define two mappers and reducers in one hadoop job class?Hadoop MapReduce:可以在一个 hadoop 作业类中定义两个映射器和化简器吗?
【发布时间】:2012-06-20 15:23:46
【问题描述】:

我有两个独立的 java 类来执行两个不同的 mapreduce 作业。我可以独立运行它们。他们操作的输入文件对于这两个作业是相同的。所以我的问题是是否可以在一个 java 类中定义两个映射器和两个化简器,比如

mapper1.class
mapper2.class
reducer1.class
reducer2.class

然后喜欢

job.setMapperClass(mapper1.class);
job.setmapperClass(mapper2.class);
job.setCombinerClass(reducer1);
job.setCombinerClass(reducer2);
job.setReducerClass(reducer1);
job.setReducerClass(reducer2);

这些设置方法实际上是覆盖以前的方法还是添加新的方法?我尝试了代码,但它执行唯一最新的给定类,这让我认为它会覆盖。但一定有办法做到这一点吗?

我问这个的原因是我只能读取一次输入文件(一个 I/O),然后处理两个 map reduce 作业。我也想知道如何将输出文件写入两个不同的文件夹。目前,这两个作业是独立的,需要一个输入和一个输出目录。

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    你可以有多个映射器,但在一项工作中,你只能有一个减速器。您需要的功能是MultipleInput、MultipleOutput 和GenericWritable。

    使用MultipleInput,可以设置mapper和对应的inputFormat。这是我的post关于如何使用它。

    使用GenericWritable,您可以在reducer 中分离不同的输入类。这是我的post关于如何使用它。

    使用MultipleOutput,可以在同一个reducer中输出不同的类。

    【讨论】:

    • 感谢您的评论!我会试试看。
    【解决方案2】:

    您可以为此使用 MultipleInputs 和 MultipleOutputs 类,但两个映射器的输出都将发送到两个 reducer。如果两个 mapper/reducer 对的数据流确实彼此独立,则将它们作为两个独立的作业。顺便说一句,MultipleInputs 将运行您的映射器而无需更改,但必须修改减速器才能使用 MultipleOutputs

    【讨论】:

    • @Chris 两对 MR 共享相同的输入,这让我想到只能读取一次输入。映射器使用不同的键。这意味着一个映射器的键与另一个映射器的键不同。我想的原因是我只能读取一次输入文件,以便在两对不同的 MR 中处理它们,它们独立工作。
    【解决方案3】:

    根据我的理解,这来自将 map-reduce 与 Hadoop 流结合使用,您可以链接多个映射器和化简器,其中一个消耗另一个的输出

    但您不应该同时运行不同的映射器和缩减器。映射器本身取决于要处理的块数。映射器应根据该决定进行实例化,而不是根据作业可用的映射器种类进行实例化。

    [编辑:根据您的评论]

    我认为这是不可能的。您可以链接(reducers 将从 mapper 接收所有输入。您可以对它们进行排序,但您不能专门运行独立的 mapper 和 reducer 集。

    我认为您可以做的是,即使您从映射器接收到两个减速器的输入,您也可以使映射器输出 (K,V) 是这样一种方式,您可以在减速器中区分哪个映射器是(K,V)的起源。这样,两个 reducer 都可以处理选择性 (K,V) 对。

    【讨论】:

    • 酷,没想到有这种可能。但是我怎样才能分离输出文件,说我可以在我的减速器实现中处理它,我需要以某种方式指定哪些键被写入到哪里。
    • 不,鲍勃:你不能那样做。您可以在 map1, map2 中将 K,V 作为 K, (map1, V) 提交,以便在 reducer 中您知道数据的来源。每个 reducer 在作业输出中创建自己的文件,以便您的输出已经被隔离。
    【解决方案4】:

    ChainMapper 类允许在单个 Map 任务中使用多个 Mapper 类。例如请看here。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      相关资源
      最近更新 更多