0

I'm still trying to get an intuition as to when to use the Hadoop combiner class (I saw a few articles but they did not specifically help in my situation).

My question is, is it appropriate to use a combiner class when the value of the pair is of the Text class? For instance, let's say we have the following output from the mapper:

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

Can we apply a combiner class here to be:

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

before it even reaches the reducer?

4

2 回答 2

3

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

现在没有理由不能引入组合器来累积为每个键观察到的值的列表(我假设这就是您的示例所显示的),但是有些事情会使它变得更棘手。

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

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

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

  • 如果您想查找与每个键关联的字典最小或最大值
  • 每个键都有数百万个值,并且您想“随机”采样一小部分值
于 2012-04-09T00:58:16.970 回答
0

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

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

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

合路器的优点:

  • 它减少了 Map 和 reducer 之间的网络 I/O
  • 它减少了减速器中的磁盘 I/O,因为它是在 Comabiner 中执行的一部分。
于 2014-08-13T08:29:48.480 回答