文本的Hadoop组合器类

3bygqnnd  于 2022-11-28  发布在  Hadoop
关注(0)|答案(2)|浏览(249)

我仍然在努力获得关于何时使用Hadoop组合器类的直觉(我看了一些文章,但它们对我的情况没有特别的帮助)。
我的问题是,当pair的值是Text类的值时,使用组合类合适吗?例如,假设我们从Map器中得到以下输出:

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

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

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

在它到达减速器之前

uplii1fm

uplii1fm1#

组合器通常适用于对数据执行某种形式的聚合、最小值、最大值等操作的问题-这些值可以在组合器中为Map输出计算,然后在化简器中为所有组合输出再次计算。这很有用,因为这意味着您不必在Map器和化简器之间的网络上传输所有数据。
现在,没有理由不引入一个组合器来累积每个键观察到的值的列表(我假设这是您的示例所显示的),但是有一些事情会使它变得更复杂。
如果你必须从mapper输出<Text, Text>对,并在reducer中使用<Text, Text>,那么你的组合器可以很容易地将值列表连接在一起,并将其输出为一个文本值。现在在reducer中,你可以做同样的事情,将所有的值连接在一起,形成一个大的输出。
如果您想对输出列表进行排序和重复数据删除,可能会遇到问题-因为组合器/缩减器逻辑需要将Text对象标记回单词,对列表进行排序和重复数据删除,然后重建单词列表。
为了直接回答你的问题-什么时候合适,我可以想到一些例子:

  • 如果要查找与每个键关联的词典编纂最小值或最大值
  • 每个键都有数百万个值,您希望“随机”对一小组值进行采样
j0pj023g

j0pj023g2#

组合类是在有情况时使用交换或结合的方法。交换例:
abc = cba在组合任务执行(a * b = d),c期间,然后将d,c的值发送到reducer。现在,reducer只需执行一个任务而不是两个任务,即a * b = d d * c,以获得最终答案。如果使用组合器,则只需执行d * c。
类似地,对于关联(a + b)+c = a+(b + c),关联(分组)和交换(移动)的结果不会因相乘或相加而不同。主要组合器用于遵守关联和交换的结构化数据。
合路器的优点:

  • 减少Map和Reducer之间的网络I/O
  • 它减少了Reducer中的磁盘I/O,因为执行的一部分发生在组合器中。

相关问题