【问题标题】:Hadoop Combiner Class for Text用于文本的 Hadoop 组合器类
【发布时间】:2012-04-21 08:38:29
【问题描述】:

我仍在尝试了解何时使用 Hadoop 组合器类(我看过一些文章,但它们对我的情况没有特别帮助)。

我的问题是,当对的值是 Text 类时,使用组合器类是否合适?例如,假设我们有来自映射器的以下输出:

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

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

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

在它到达减速器之前?

【问题讨论】:

  • 呃,如果这就是你希望减速器接收数据的方式......那么是的。
  • @BrianRoach 如果可能的话,reducer 基本上是在做组合器会做的事情。你能详细说明你的答案吗?作为免责声明,我有一个作业,我的教授问我们为什么不能将组合器类引入类似于上面示例的情况。但是,我觉得好像可以,这就是我问的原因。

标签: java map hadoop reduce combiners


【解决方案1】:

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

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

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

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

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

  • 如果您想查找与每个键关联的字典最小或最大值
  • 每个键都有数百万个值,并且您想“随机”抽取一小部分值

【讨论】:

  • 谢谢这是一个很好的解释。您实际上达到了我的情况的目标,因为组合器类会引入重复项。
【解决方案2】:

Combiner 类在有使用交换或关联方法的情况下使用。交换例子:

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

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

组合器的优势:

  • 它减少了 Map 和 reducer 之间的网络 I/O
  • 它减少了磁盘 I/O 作为 executionn 的一部分的 reducer 发生在 Combiner 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2018-04-08
    • 2011-12-11
    相关资源
    最近更新 更多