我有1 TB未排序的单词计数(word:count),我想运行一个map reduce作业,该作业将选择具有最大计数的单词。在本例中,我希望拥有一个变量,该变量在所有reduce作业之间共享,该变量将保存到目前为止字数最多的单词。reduce函数只会检查这个变量并在必要时更新它。这可能吗?由于
你可以
- 设置减速器的数量为1
- 向reducer类添加两个实例变量,一个用于计数,一个用于单词,以保存有关最频繁的单词的信息。
- 初始化reduce setup()方法中的变量 reduce()方法中的
- 检查当前单词是否比最频繁出现的次数多,如果是,将单词和计数存储在变量 中
- 在cleanup()方法中,您可以访问具有最频繁的单词 的变量。
如果需要运行多个reducer,那么修改reducer的cleanup()方法,改为将单词及其计数作为键值对写入上下文。一个类似于上面原始减速器的后续减速器可以很容易地找到出现次数最多的单词。
我认为你误解了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