9

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

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 作业。我也想知道如何将输出文件写入两个不同的文件夹。目前,这两个作业是分开的,需要一个输入和一个输出目录。

4

4 回答 4

12

你可以有多个映射器,但在一项工作中,你只能有一个减速器。您需要的功能MultipleInputMultipleOutputGenericWritable

使用MultipleInput,您可以设置映射器和相应的输入格式。这是我关于如何使用它的帖子。

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

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

于 2012-06-20T22:23:09.370 回答
2

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

于 2012-06-20T15:54:01.567 回答
0

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

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

[编辑:根据您的评论]

我不认为这是可能的。您可以链接(reducers 将接收来自映射器的所有输入。您可以对它们进行排序,但您不能专门运行独立的映射器和化简器集。

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

于 2012-06-20T15:54:18.123 回答
0

The ChainMapper class allows to use multiple Mapper classes within a single Map task. For example please look at here.

于 2016-04-17T22:44:51.143 回答