1

如何将 Mapper 中收集的少量元数据传递给 Reducer?在我的具体问题中,我只想传递两个值,所以我不会为这些使用MultipleOutputFormatMultipleOutputs

我尝试过的一些变体:

(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 。



类似的问题:

将值从 Mapper 传递到 Reducer

从 reducer 访问映射器的计数器 (这看起来很有希望,但似乎它不适用于 0.20.2 API)

4

1 回答 1

1

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

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

您在新 API 中还具有 SetUp() 和 CloseUp() 方法(旧 API 中也有类似方法,但我不记得名称)以利用它们仅在每个节点上仅执行一次的事实,在该节点上的所有 map/reduce 任务开始/完成之前/之后。

于 2012-05-25T19:19:56.417 回答