将少量值从Mapper传递给Reducer

时间:2012-05-25 00:15:17

标签: java hadoop

如何将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)

1 个答案:

答案 0 :(得分:1)

如果使用计数器找不到问题的解决方案(在特定情况下将两个长值从mapper传递到reducer),则另一种方法可以利用顺序反转模式。

在这种模式中,你所做的是从map中发出一个额外的键值对,键是一个东西,它成为第一个减速器接收的键(利用reducer按排序顺序接收键的事实)。例如,如果要发出的键是1到1000之间的数值。您的虚拟键可能是“0”。由于reducer按排序顺序接收密钥,因此保证在任何其他密钥之前处理虚拟密钥。

另外你在新API中有SetUp()和CloseUp()方法(旧API中也有类似的方法,但我不记得名字),以利用它们只执行一次的事实每个节点,在该节点上的所有map / reduce任务开始/结束之前/之后。