我正在开发著名的WordCount程序的稍有改进的版本,该程序应输出该单词占本书的百分比。例如:
...
war 0.00002332423%
peace 0.0034234324%
...
基本上,我需要计算所有单词,计算每个单词的出现次数,然后将这组值除以总计数。因此,至少应该有两个工作:
作业1
input
目录并生成两个输出目录:output1
和output2
(word, 1)
对写入output1
,对("total_count", 1)
对写入output2
(word, n)
中生成output1
,计算总数以在("total_count", N)
中生成output2
工作2
output1
和output2
作为输入文件夹,并将结果写入output3
total_count
,将结果写入output3
我的问题:
MultipleOutputs
,但在这种情况下,映射器的结果不会进入reducer。 output2
,因为如果没有总数,从output1
中读取结果是没有用的。我认为这是使用MapReduce的错误方式(我们不应使用任何类型的同步),但看不到正确的方式。 最佳答案
只需考虑使用一个Job:total_count
可以从第一个作业的 map 阶段计算得出。实际上,它已经被算作MAP_OUTPUT_RECORDS
了。这是所有 map 输出(key, value)
对的总和。因此,如果您始终将值设为1,则此总和就是您想要的,即文档中单词的总数(重复)。
现在,我不知道您是否可以在 reducer 的配置中获得此计数器。然后,您可以为每个单词输出一对(word, wordCount/MAP_OUTPUT_RECORDS)
。我认为您可以通过以下方式做到这一点:
新API:
context.getCounter("org.apache.hadoop.mapred.Task$Counter", "MAP_OUTPUT_RECORDS").getValue();
旧API:
reporter.getCounter("org.apache.hadoop.mapred.Task$Counter", "MAP_OUTPUT_RECORDS").getValue();