2013-02-28 51 views
0

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

+0

看看这个答案是否有帮助:http://stackoverflow.com/questions/15048013/sharing-data-between-master-and-reduce/15073701#15073701 – Amar 2013-03-01 19:09:28

回答

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进行排序,然后您可以实现一个单独的简化器,它只检查每个列表中的第一个值。但是,您无法对组合器执行此操作,其输入未分类。因为它不会读取其余的数据,所以可能会让实现更快。

有关如何有效地使用排序阶段的详细信息,请参阅How does MapReduce framework implement the sort phase?

过程的概述:http://wiki.apache.org/hadoop/HadoopMapReduce

2

你可以

  • 设置减速机的数量为1
  • 将两个实例变量添加到reducer类中,一个用于计数,另一个用于单词,以保存关于最频繁的词的形成呢。
  • 将reduce()方法中的reduce setup()方法
  • 中的变量初始化为reduce()方法,检查当前单词是否出现的次数多于最常出现的次数,如果是,则将单词和计数存入变量
  • 在清理()方法,你可以访问的变量有最常说的一句话

如果需要运行多个减速,然后修改减速的清理()方法,而不是写出来的字并将其作为关键值对计算在上下文中。类似于上述原始减速器的后续减速器可以轻松找到出现次数最多的单词。