我仍然在努力获得关于何时使用Hadoop组合器类的直觉(我看了一些文章,但它们对我的情况没有特别的帮助)。
我的问题是,当pair的值是Text类的值时,使用组合类合适吗?例如,假设我们从Map器中得到以下输出:
fruit apple
fruit orange
fruit banana
...
veggie carrot
veggie celery
...
我们可以在这里应用一个组合器类:
fruit apple orange banana
...
veggie carrot celery
...
在它到达减速器之前
2条答案
按热度按时间uplii1fm1#
组合器通常适用于对数据执行某种形式的聚合、最小值、最大值等操作的问题-这些值可以在组合器中为Map输出计算,然后在化简器中为所有组合输出再次计算。这很有用,因为这意味着您不必在Map器和化简器之间的网络上传输所有数据。
现在,没有理由不引入一个组合器来累积每个键观察到的值的列表(我假设这是您的示例所显示的),但是有一些事情会使它变得更复杂。
如果你必须从mapper输出
<Text, Text>
对,并在reducer中使用<Text, Text>
,那么你的组合器可以很容易地将值列表连接在一起,并将其输出为一个文本值。现在在reducer中,你可以做同样的事情,将所有的值连接在一起,形成一个大的输出。如果您想对输出列表进行排序和重复数据删除,可能会遇到问题-因为组合器/缩减器逻辑需要将Text对象标记回单词,对列表进行排序和重复数据删除,然后重建单词列表。
为了直接回答你的问题-什么时候合适,我可以想到一些例子:
j0pj023g2#
组合类是在有情况时使用交换或结合的方法。交换例:
abc = cba在组合任务执行(a * b = d),c期间,然后将d,c的值发送到reducer。现在,reducer只需执行一个任务而不是两个任务,即a * b = d d * c,以获得最终答案。如果使用组合器,则只需执行d * c。
类似地,对于关联(a + b)+c = a+(b + c),关联(分组)和交换(移动)的结果不会因相乘或相加而不同。主要组合器用于遵守关联和交换的结构化数据。
合路器的优点: