我可以将多个mapper类设置为一个作业吗?
例如,我有一个来自HDFS的csv输入文件。我有两个任务要做。第一个是从csv输入文件中计算两个字段,并将结果输入到输出文件中。第二个是从同一个csv输入文件中计算另外两个字段,并将结果输入另一个输出文件。减速机是一样的。
我如何只使用一份工作来实现这一目标并同时进行处理? (我不想做第一个,然后在第一个完成之后做第二个,我想让它们并行处理)。
我尝试以下代码:
job1.setMapperClass(Mapper1.class);
job1.setReducerClass(LogReducer.class);
job1.setMapperClass(Mapper2.class);
job1.setReducerClass(LogReducer.class);
我尝试但它不起作用,它只显示第二个结果,第一个结果消失了。
答案 0 :(得分:2)
显然需要两个并行运行的作业。由于映射任务和输出路径不同,并行运行两个作业有什么问题。如果没有链接,Job无法处理多个映射器。
答案 1 :(得分:2)
所以问题是你是否需要减速器的一个输出或两个输出。您可以映射两个输入,一个映射由Mapper1映射,另一个映射映射到Mapper2,然后将合并的中间结果传递给reducer以获得一个输出。这是在单个作业中使用MultipleInputs类,可以在驱动程序类中配置。
如果希望Mapper1的简化结果与Mapper2的简化结果分开,则需要配置两个作业。这两个作业将有不同的映射器,但会配置相同的reducer类。
答案 2 :(得分:1)
查看Hadoop中的MultipleOutputs类,从reducer写入多个文件。根据reduce方法中的条件将输出写入第二个文件。