如何在hadoop中的所有reduce作业中使用共享变量

时间:2013-02-28 01:52:09

标签: hadoop mapreduce word-count

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

2 个答案:

答案 0 :(得分: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检查每个列表中的第一个值。但是,您无法对组合器执行此操作,其输入未排序。可能会在实现中使事情变得更快,因为它不会读取剩余的数据。

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

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

答案 1 :(得分:2)

你可以

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

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