java - 用于文本的 Hadoop 组合器类

标签 java hadoop mapreduce combiners

我仍在尝试获得关于何时使用 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/

相关文章:

java - 有没有解析用户代理字符串的好方法?

hadoop - AWS 上的 MapReduce

java - 如何远程运行 mapreduce 作业

mongodb - 什么时候需要 map reduce 进行数据库查询?

java - MapReduce 上 Cassandra 执行错误

java - 我是否需要为列设置自动增量才能生成 identit 工作

java - guava的ImmutableList并不是真的不可变

java - 适用于移动设备的 Android Fragments(或其他东西)

hadoop - 在 pig 中,我想减少组以具有 1 个具有优先级的特定类型的元素

amazon-web-services - Cloudbreak的优势和局限性