最近开始使用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 ,但我似乎无法找到它的解释。
另外,只是为了澄清 - 我是否正确地说 term 是关键,而Reduce中的 sum 形成了键值对(分别)?如果是这种情况,值只是从Map发出的每个 term 的1个列表?这是我能理解它的唯一方法,但这些只是假设。
为noob问题道歉,我已经看过教程,但很多时候我发现使用了很多令人困惑的术语,并且整体基本的东西比实际上更复杂,所以我是努力解决这个问题。
感谢任何帮助!
答案 0 :(得分:3)
将此输入作为示例字数输入。
Mapper会将这句话分成单词。
Take,1
this,1
input,1
as,1
an,1
example,1
word,1
count,1
input,1
然后,减速器接收&#34;组&#34;相同的单词(或键)和分组值的列表,如此(并另外对键进行排序,但这对于此示例并不重要)
Take, (1)
this, (1)
input (1, 1)
etc...
正如您所看到的,关键input
已被减少&#34;在单个元素中,你可以循环并对值求和并像这样发出
Take,1
this,1
input,2
etc...
答案 1 :(得分:2)
好问题。
如上所述,映射器输出一系列(key, value)
对,在这种情况下,每个单词的格式(word, 1)
,缩减器收到的分组为(key, <1,1,...,1>)
,总结条款在列表中并返回(key, sum)
。请注意,不是执行分组的reducer;这是map-reduce环境。
map-reduce programming model与我们习惯使用的不同,而且在这个模型中如何实现算法通常并不明显。 (例如,考虑一下如何实现k-means聚类。)
我推荐Leskovec等人免费提供的Mining of Massive Data Sets book第2章。另请参阅the corresponding slides。