我有一个1 TB的未排序字数(字数:计数),我想运行一个map reduce工作,它会选择具有最大计数的字。在这种情况下,我希望有一个变量在所有reduce作业之间共享,这些作业将保存到目前为止最大字数的单词。 reduce函数只检查此变量并在必要时更新它。那可能吗?感谢
答案 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?
答案 1 :(得分:2)
你可以
如果需要运行多个reducer,则修改reducer的cleanup()方法,将该单词及其计数写入上下文作为键值对。类似于上面原始减速器的后续减速器可以很容易地找到出现次数最多的单词。