最近开始使用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,但我似乎找不到对此的解释。
此外,我只是想澄清一下,我说术语是键,而Reduce形式中的和(分别)是键值对,这正确吗?如果是这种情况,值是否只是Map发出的每个项的1列表?这是我唯一能理解的方法,但这些只是假设。
很抱歉,我看过教程,但很多时候我发现使用了很多令人困惑的术语,总体上基本的事情比实际情况更复杂,所以我有点难以理解。
感谢您的帮助!
将此输入作为字数输入的示例。
Mapper会把这个句子分成单词。
Take,1
this,1
input,1
as,1
an,1
example,1
word,1
count,1
input,1
然后,reducer接收相同单词的"组"(或键)和类似的分组值列表(并对键进行额外排序,但这对本例来说并不重要)
Take, (1)
this, (1)
input (1, 1)
etc...
正如你所看到的,密钥input
已经"简化"为一个元素,你可以循环并求和这些值,然后像一样发出
Take,1
this,1
input,2
etc...
好问题。
如所解释的,映射器输出(key, value)
对的序列,在这种情况下,形式为每个单词的(word, 1)
,缩减器接收分组为(key, <1,1,...,1>)
,对列表中的项求和并返回(key, sum)
。请注意,进行分组的是而不是减速器;这是地图还原环境。
map reduce编程模型与我们习惯使用的模型不同,并且通常不清楚如何在该模型中实现算法。(例如,想想如何实现k均值聚类。)
我推荐Leskovec等人免费提供的《海量数据集挖掘》一书的第2章。另请参阅相应的幻灯片。