我可以在一个作业中设置多个Map器类吗?
例如,我有一个来自hdfs的csv输入文件。我有两件事要做。第一种方法是从csv输入文件中计算两个字段,并将结果输入到输出文件中。第二种方法是从同一个csv输入文件中计算另外两个字段,并将结果放入另一个输出文件中。减速器相同。
我怎样才能做到这一点仅仅使用一个工作,使他们在同一时间的过程(我不想先做第一个,然后在第一个完成后再做第二个,我想让他们并行处理)。
我尝试以下代码:
job1.setMapperClass(Mapper1.class);
job1.setReducerClass(LogReducer.class);
job1.setMapperClass(Mapper2.class);
job1.setReducerClass(LogReducer.class);
我试过了,但是没有用,它只显示第二个结果,第一个结果消失了。
3条答案
按热度按时间h7wcgrx31#
看看hadoop中的multipleoutputs类,它可以从一个reducer写入多个文件。根据reduce方法中的条件将输出写入第二个文件。
guykilcj2#
它显然需要两项工作并行运行。由于Map任务和输出路径不同,并行运行两个作业有什么问题。作业无法处理多个Map器(如果未链接)。
x9ybnkn63#
所以问题是你是想要减速机的一个输出还是两个输出。您可以Map两个输入,一个由mapper1Map,另一个由mapper2Map,然后将合并的中间结果传递给一个reducer以获得一个输出。在单个作业中使用multipleinputs类,可以在driver类中配置。
如果希望mapper1的简化结果与mapper2的简化结果分开,则需要配置两个作业。这两个作业将具有不同的Map器,但将配置相同的reducer类。