我可以在一个作业中设置多个映射器类吗?
例如,我有一个来自HDFS的csv输入文件。我有两项任务要做。第一项是计算csv输入文件中的两个字段,并将结果输入到输出文件中。第二种方法是对同一csv输入文件中的另外两个字段进行计数,并将结果输入到另一个输出文件中。减速器是相同的。
我怎么能只用一份工作就做到这一点,并让他们同时处理?(我不想做第一个,然后在第一个完成后再做第二个,我想让他们并行处理)。
我尝试以下代码:
job1.setMapperClass(Mapper1.class);
job1.setReducerClass(LogReducer.class);
job1.setMapperClass(Mapper2.class);
job1.setReducerClass(LogReducer.class);
我试过了,但没用,它只显示了第二个结果,第一个已经消失了。
它显然需要两个作业并行运行。由于映射任务和输出路径不同,并行运行两个作业有什么问题。如果作业未被链接,则它无法处理多个映射程序。
所以问题是您是否希望从reducer中获得一个输出或两个输出。您可以映射两个输入,一个由Mapper1映射,另一个由Mapper2映射,然后将合并的中间结果传递到reducer中以获得一个输出。这是在单个作业中使用MultipleInputs类,并且可以在驱动程序类中进行配置。
如果希望Mapper1的缩减结果与Mapper2的缩减结果分离,则需要配置两个作业。这两个作业将具有不同的映射器,但将配置相同的reducer类。
看看Hadoop中的MultipleOutputs类,从一个reducer写入多个文件。根据reduce方法中的条件将输出写入第二个文件。