0

我有 1 TB 的未排序字数(字数:字数),我想运行一个 map reduce 作业来选择字数最多的单词。在这种情况下,我希望有一个在所有减少作业之间共享的变量,该变量将保存迄今为止最大字数的单词。reduce 函数只会检查这个变量并在必要时更新它。那可能吗?谢谢

4

2 回答 2

2

你可以

  • 将减速器的数量设置为 1
  • 向 reducer 类添加两个实例变量,一个用于计数,一个用于单词,以保存有关最常见单词的信息。
  • 在 reduce setup() 方法中初始化变量
  • 在 reduce() 方法中检查当前单词是否比最频繁出现的单词多,如果是,则将单词和计数存储在变量中
  • 在 cleanup() 方法中,您可以访问变量以获得最常用的单词

如果需要运行多个 reducer,则修改 reducer 的 cleanup() 方法,改为将单词及其计数作为键值对写入上下文。与上面的原始 reducer 类似的后续 reducer 可以轻松找到出现次数最多的单词。

于 2013-02-28T05:24:15.543 回答
2

我认为您误解了 Mapreduce 的工作原理。尽管您受到 Mapreduce 模型机制的限制,但它不会在机器之间共享内存以增加吞吐量。

为了做你所说的,你会做以下事情:

Map : (word, count) -> (KEY_CONSTANT, (count, word))

Combine/Reduce : (key, List<(count, word)>) -> (key, (count*, word*) with max count)

如果您添加count到键,但确保所有内容仍在一个分区中,您可以告诉 MapReduce 按降序对键进行排序count,然后您可以实现一个单独的 reducer,它只检查每个列表中的第一个值。但是,您不能对输入未排序的组合器执行此操作。由于它不会读取其余数据,因此可能会使实现速度更快。

有关如何有效使用排序阶段的更多信息,请参阅MapReduce 框架如何实现排序阶段?

过程的一般描述: http ://wiki.apache.org/hadoop/HadoopMapReduce

于 2013-02-28T05:13:52.900 回答