我在这里读到MapReduce,他们给出的第一个例子是计算文档中每个单词的出现次数。我在想,假设你想获得文档中出现频率最高的20%的单词,你怎么才能做到呢?这似乎不自然,因为集群中的每个节点都不能看到整个文件,只能看到单个单词的所有出现列表。有办法做到这一点吗?
是的,你当然可以做到这一点:通过强迫hadoop只有一个reducer(尽管这种方法你失去了分布式计算本身的优势)。
可以这样做:
// Configuring mapred to have just one reducer
conf.setInt("mapred.tasktracker.reduce.tasks.maximum", 1);
conf.setInt("mapred.reduce.tasks", 1);
现在因为你只有一个减速机,你可以跟踪前20%并将它们排放到减速机的run()
或cleanup()
中。