【发布时间】:2015-10-24 21:29:04
【问题描述】:
我有两个映射器类,它们处理不同的输入,但它们的输出将采用相同的格式,并将转到同一个减速器。是否可以只为两个映射器类之一实现组合器?
【问题讨论】:
标签: hadoop mapreduce combiners
我有两个映射器类,它们处理不同的输入,但它们的输出将采用相同的格式,并将转到同一个减速器。是否可以只为两个映射器类之一实现组合器?
【问题讨论】:
标签: hadoop mapreduce combiners
使用组合器,如果您将 Hadoop MR 设置为使用一个,它将处理来自所有映射器的输出。您不能指定特定的映射器。
也许考虑这两个选项:
将组合器应用于所有输出 - 将映射器的输出映射到通用类型,以便它们可以(连接?)由 Reducers 处理。考虑无论数据来自哪个映射器,组合是否都能正常工作。对这个想法的修改是在映射器输出的键或值中设置一个类型变量,并在组合中使用它来决定天气做任何事情。
使用 Map 本地组合 - 如果您知道其中一个映射器的输出将很好地组合,您可以在映射器本身内进行一些聚合/组合,并且只定期写入输出。为使其正常工作,您需要对工作中的输入数据有一定的了解。
【讨论】:
查询有点不清楚。我假设您问的是重用相同的组合器来组合两个不同映射器的输出。这应该是可能的,因为两个映射器的输出是相同的。
两个映射器可以使用MultipleInputs 类在一个作业中使用,也可以在两个不同的作业中使用。在任何情况下,都必须在每个作业的基础上指定组合器。
另外,请注意
1) mapper的o/p要和reducer的i/p匹配。
2) mapper的o/p要和combiner的i/p匹配。
3)combiner的i/p和o/p应该是同一类型的。
【讨论】:
Combiner 适用于最后一个链映射器,附上示例代码
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);
【讨论】: