用于文本的Hadoop组合器类

时间:2012-04-08 18:36:07

标签: java map hadoop reduce combiners

我仍然试图直截了当地知道何时使用Hadoop组合器类(我看过一些文章,但在我的情况下它们没有特别的帮助)。

我的问题是,当对的值是Text类时,使用组合器类是否合适?例如,假设我们有以下来自mapper的输出:

fruit apple
fruit orange
fruit banana
...
veggie carrot
veggie celery
...

我们可以在这里应用一个组合器类:

fruit apple orange banana
...
veggie carrot celery
...

甚至到达减速机之前?

2 个答案:

答案 0 :(得分:3)

组合器通常适用于您对数据执行某种形式的聚合,最小,最大等操作的问题 - 这些值可以在合成器中为地图输出计算,然后在reducer中再次计算合并后的产出。这很有用,因为这意味着您不会在映射器和减速器之间通过网络传输所有数据。

现在没有理由你不能引入一个组合器来累积每个键所观察到的值的列表(我假设这是你的例子所示),但是有一些东西会使它变得棘手。 / p>

如果必须从映射器输出<Text, Text>对,并在reducer中使用<Text, Text>,那么组合器可以轻松地将值列表连接在一起并将其输出为Text值。现在在您的reducer中,您也可以这样做,将所有值连接在一起并形成一个大输出。

如果要对输出列表进行排序和重复排序,则可能会遇到问题 - 因为组合器/缩减器逻辑需要将Text对象标记为单词,对列表进行排序和重复排序,然后重建单词列表。

直接回答你的问题 - 什么时候适当,我能想到一些例子:

  • 如果您想查找与每个键相关的词典编号最小或最大值
  • 每个键都有数百万个值,并且您希望“随机”采样一小组值

答案 1 :(得分:0)

当存在使用交换或关联方法的情况时使用组合类。可交换的例子:

abc = cba在组合任务执行期间(a * b = d),c然后将d,c的值发送到reducer。现在,reducer必须只执行一个任务而不是两个任务,即a * b = d d * c得到最终答案。如果使用组合器,只需要做d * c。

类似地,对于关联(a + b)+ c = a +(b + c) 关联(分组)和交换(移动)结果在乘法或加法方面不会有所不同。主要是组合器用于遵循Associative&amp; amp;的结构化数据。可交换的。

组合器的优点:

  • 它减少了Map和reducer之间的网络I / O
  • 它减少了磁盘I / O. reducer作为执行的一部分发生在Comabiner。