我仍在尝试获得关于何时使用 Hadoop 组合器类的直觉(我看过几篇文章,但它们对我的情况没有特别帮助)。
我的问题是,当 pair 的值为 Text 类时,使用组合器类是否合适?例如,假设我们有来自映射器的以下输出:
fruit apple
fruit orange
fruit banana
...
veggie carrot
veggie celery
...
我们可以在这里应用一个组合器类吗:
fruit apple orange banana
...
veggie carrot celery
...
甚至在它到达 reducer 之前?
最佳答案
组合器通常适用于对数据执行某种形式的聚合、最小值、最大值等操作的问题——这些值可以在组合器中为映射输出计算,然后在缩减器中再次计算所有组合输出。这很有用,因为它意味着您不会在映射器和缩减器之间通过网络传输所有数据。
现在没有理由不能引入组合器来累积每个键的观察值列表(我假设这就是您的示例显示的内容),但是有些事情会使它变得更诡异。
如果你必须输出<Text, Text>
来自映射器的对,并使用 <Text, Text>
在 reducer 中,然后您的组合器可以轻松地将值列表连接在一起并将其输出为文本值。现在在你的 reducer 中,你可以做同样的事情,将所有值连接在一起并形成一个大输出。
如果您想对输出列表进行排序和去重,您可能会遇到问题 - 因为组合器/缩减器逻辑需要将 Text 对象标记回单词,对列表进行排序和去重,然后重建单词列表。
直接回答你的问题——什么时候合适,好吧,我能想到一些例子:
- 如果你想找到与每个键关联的字典序最小或最大值
- 每个键都有数百万个值,并且您想“随机”抽取一小部分值
关于java - 用于文本的 Hadoop 组合器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10065314/