如何将Mapper中收集的少量元数据传递给Reducer?在我的具体问题中,我只想传递两个长值,因此我不会使用 MultipleOutputFormat 或 MultipleOutputs 。
我试过的一些变种:
(1)
映射
context.getCounter("Countergroup", "Counter").increment(1);
减速
counter = context.getCounter("Countergroup", "Counter").getValue();
计数器不会定期更新,因此Reducer中的函数调用会产生0值。
(2)
映射
context.getConfiguration().setInt("Counter", countTotal);
减速
counter = context.getConfiguration().getInt("Counter", 0);
当然,在正在运行的作业期间无法更改配置(值得尝试)。
关于这个问题已有问题,但我找不到合适的答案。此外,API已更改。我使用的是Hadoop 0.20.2。
类似的问题:
Passing values from Mapper to Reducer
Accessing a mapper's counter from a reducer (这看起来很有希望,但似乎它不适用于0.20.2 API)
答案 0 :(得分:1)
如果使用计数器找不到问题的解决方案(在特定情况下将两个长值从mapper传递到reducer),则另一种方法可以利用顺序反转模式。
在这种模式中,你所做的是从map中发出一个额外的键值对,键是一个东西,它成为第一个减速器接收的键(利用reducer按排序顺序接收键的事实)。例如,如果要发出的键是1到1000之间的数值。您的虚拟键可能是“0”。由于reducer按排序顺序接收密钥,因此保证在任何其他密钥之前处理虚拟密钥。
另外你在新API中有SetUp()和CloseUp()方法(旧API中也有类似的方法,但我不记得名字),以利用它们只执行一次的事实每个节点,在该节点上的所有map / reduce任务开始/结束之前/之后。