我有两个映射器类,它们处理不同的输入,但它们的输出将采用相同的格式,并将进入相同的reducer。是否可以仅为两个映射器类中的一个实现组合器?
使用组合器,如果您将Hadoop MR设置为使用一个组合器,它将处理所有映射器的输出。不能指定特定的映射程序。
也许可以考虑以下两种选择:
-
将combiner应用于所有输出-将映射器的输出映射到一个公共类型,以便Reducer可以(连接?)处理它们。考虑一下,无论数据来自哪个映射器,联合收割机是否都能正常工作。对这个想法的修改是在映射器输出的键或值中设置一个类型变量,并在组合中使用它来决定是否要执行任何操作。
-
使用Map本地组合-如果您知道某个映射器的输出组合良好,则可以在映射器本身内进行一些聚合/组合,并且只定期写入输出。为了让这项工作顺利进行,你需要对工作中的输入数据有一些很好的了解。
查询有点不清楚。我想您是在询问如何重用同一个组合器来组合两个不同映射器的输出。这应该是可能的,因为两个映射器的输出是相同的。
两个映射器可以使用MultipleInputs类在单个作业中使用,也可以在两个不同的作业中使用。在任何情况下,必须在每个作业的基础上指定组合器。
此外,请注意
1) 映射器的o/p应该与reducer的i/p匹配。
2) 映射器的o/p应该与组合器的i/p匹配。
3) 组合器的i/p和o/p应该是相同的类型。
适用于最后一个链映射器的组合器,随附样本代码
ChainMapper.addMapper(job, SalesRecordMapper.class, LongWritable.class, Text.class, Text.class, DoubleWritable.class, configuration);
ChainMapper.addMapper(job, ItemDiscountMapper.class, Text.class, DoubleWritable.class, Text.class, DoubleWritable.class, configuration);
job.setCombinerClass(DoubleReducer.class);