0

我可以将多个映射器类设置为一项工作吗?

例如,我有一个来自 HDFS 的 csv 输入文件。我有两个任务要做。第一个是从 csv 输入文件中计算两个字段并将结果放入输出文件中。第二个是从同一个 csv 输入文件中计算另外两个字段并将结果放入另一个输出文件中。减速机是一样的。

我怎么能仅使用一项工作来实现这一目标并使它们同时处理?(我不想做第一个,然后在第一个完成后做第二个,我想让它们并行处理)。

我尝试以下代码:

    job1.setMapperClass(Mapper1.class);
    job1.setReducerClass(LogReducer.class);

    job1.setMapperClass(Mapper2.class);
    job1.setReducerClass(LogReducer.class);

我尝试了它,但它不起作用,它只显示第二个结果,第一个结果消失了。

4

3 回答 3

2

它显然需要两个作业并行运行。由于映射任务和输出路径不同,并行运行两个作业有什么问题。作业不能处理多个映射器,如果它没有被链接。

于 2013-07-18T23:39:28.000 回答
2

所以问题是你是否想要减速器的一个输出或两个输出。您可以映射两个输入,一个由 Mapper1 映射,另一个由 Mapper2 映射,然后将合并的中间结果传递给 reducer 以获得一个输出。这是在单个作业中使用 MultipleInputs 类,并且可以在驱动程序类中进行配置。

如果希望 Mapper1 的缩减结果与 Mapper2 的缩减结果分开,则需要配置两个作业。这两个作业将具有不同的映射器,但会配置相同的减速器类。

于 2013-07-19T02:17:03.453 回答
1

查看 Hadoop 中的MultipleOutputs类,以从 reducer 写入多个文件。根据 reduce 方法中的条件将输出写入第二个文件。

于 2013-07-19T05:38:03.010 回答