最近开始使用hadoop,并努力理解一些事情。下面是我正在查看的一个基本wordcount示例(计算每个单词出现的次数):
Map(String docid, String text):
for each word term in text:
Emit(term, 1);
Reduce(String term, Iterator<Int> values):
int sum = 0;
for each v in values:
sum += v;
Emit(term, sum);
首先,什么是 Emit(w,1)
你应该做什么?我注意到在所有的例子中,我看到的第二个参数总是设置为1,但我似乎找不到解释。
另外,我要澄清的是,术语是键和值对的归约形式的和(分别)是正确的吗?如果是这样的话,那么值仅仅是从map发出的每个术语的1的列表吗?这是我能理解的唯一方法,但这些只是假设。
对于noob的问题我深表歉意,我看过一些教程,但是很多时候我发现使用了很多令人困惑的术语,总体来说,基本的事情要比实际情况复杂得多,所以我很难理解这一点。
谢谢你的帮助!
2条答案
按热度按时间yks3o0rb1#
以这个输入作为一个单词计数输入的例子。
制图员将把这个句子分成几个单词。
然后,reducer接收相同单词(或键)的“groups”和这样的分组值列表(并对键进行额外排序,但这对于本例并不重要)
如你所见,钥匙
input
已经“简化”为一个元素,您可以循环和求和这些值,并像这样发射13z8s7eq2#
问得好。
如前所述,Map器输出一系列
(key, value)
对,在这种情况下的形式(word, 1)
对于reducer接收的每个字,将其分组为(key, <1,1,...,1>)
,汇总列表中的术语并返回(key, sum)
. 请注意,不是reducer进行分组;是MapReduce环境。map-reduce编程模型与我们以前使用的模型不同,在这个模型中如何实现一个算法通常并不明显(例如,考虑一下如何实现k-means集群。)
我推荐leskovec等人编写的《海量数据集的免费挖掘》一书的第2章,也可以参考相应的幻灯片。