Hadoop几个映射器

时间:2013-07-18 23:12:42

标签: java hadoop mapreduce

我可以将多个mapper类设置为一个作业吗?

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

我如何只使用一份工作来实现这一目标并同时进行处理? (我不想做第一个,然后在第一个完成之后做第二个,我想让它们并行处理)。

我尝试以下代码:

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

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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