【问题标题】:How to control the sort order of mapper result in mapreduce before being sent to reducer如何在发送到reducer之前控制mapper结果在mapreduce中的排序顺序
【发布时间】:2013-11-06 21:38:55
【问题描述】:

以字数统计示例的细微变化来解释我正在尝试做的事情。

我有 3 个映射器,每个映射器在 3 个大型输入文件上产生完整的字数统计结果。 假设输出是:

Mapper 1 Result:
-------
cat 100
dog 50
fox 10

Mapper 2 Result:
-------
fox 200
pig 5
rat 1

Mapper 3 Result:
-------
dog 70
rat 50
fox 10

请注意,每个结果都是一个完整的字数,带有唯一键,计算给定文件的结果。

现在在减速器方面,我的算法要求只有一个减速器, 并且由于这里讨论的时间有点太长,我希望每个映射器的结果以计数的降序输入reducer,但不执行任何洗牌和排序步骤。即我喜欢reducer按以下顺序从每个映射器接收结果,而不用任何键分组:

cat 100
dog 50
fox 10

fox 200
pig 5
rat 1

dog 70
rat 50
fox 10

即只需将每个映射器的结果按值(非键)的降序加载到reducer

【问题讨论】:

  • 澄清一下,对于dog,正常行为是发送到Reducer 的内容是'("dog", {50,70}). Do you want it sent to the Reducer as ("dog", { 70,50})? Or do you not want common keys produced by disparate Mappers` 要合并吗?
  • 嗨约翰,你是对的,我不希望由不同的映射器产生的公共密钥被组合。同时我希望单个reducer以计数的降序接收来自所有映射器的元组,因为该算法涉及查找topN元素..

标签: sorting hadoop mapreduce shuffle


【解决方案1】:

看起来这应该是一个仅限地图的工作,因为您不希望发生随机和排序。

如果你真的需要使用 Reduce,那么我建议你需要一个复合键并进行二次排序。

键将包括映射器 ID、普通键和计数值。您将对映射器 ID 进行初级排序,对计数进行二级排序。您还需要一个不分组(或仅按映射器 ID 和普通键分组)的分组比较器。

再一次,看看你需要做的所有事情来使用 Reducer 来防止 Shuffle 和 Sort,似乎这应该是一个 Map-only 工作,除非输出必须在一个文件中。

【讨论】:

  • 即使它必须是单个文件,他也可以始终使用 -getmerge shell 命令...hadoop.apache.org/docs/r0.19.1/hdfs_shell.html#getmerge
  • 感谢您的回复..很高兴知道这实际上是可能的.. 我认为我确实需要一个 reducer,因为这个想法是每个映射器结果都代表一个“部分”TopN 结果使用组合器执行的近似算法。现在必须使用相同的算法合并这些部分 topN 结果以产生全局近似 TopN。 (非常类似于 CountBy 在级联中所做的).. 也 -getmerge 不是一个选项,因为这不是一个简单的合并..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多