试图理解一个基本的 WordCount MapReduce 示例
Posted
技术标签:
【中文标题】试图理解一个基本的 WordCount MapReduce 示例【英文标题】:Trying to make sense of a basic WordCount MapReduce example 【发布时间】:2016-03-29 16:07:54 【问题描述】:最近开始使用 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 是键,而 sum 在 Reduce 中形成键值对(分别)?如果是这种情况,values 是否只是从 Map 发出的每个 term 的 1 列表?这是我能理解它的唯一方法,但这些只是假设。
对于这个菜鸟问题,我深表歉意,我看过教程,但很多时候我发现使用了很多令人困惑的术语,而且总体上的基本内容比实际情况更复杂,所以我正在苦苦挣扎有点难以理解。
感谢任何帮助!
【问题讨论】:
【参考方案1】:将此输入作为示例字数输入。
Mapper 会将这个句子拆分成单词。
Take,1
this,1
input,1
as,1
an,1
example,1
word,1
count,1
input,1
然后,reducer 接收相同单词(或 key)的“组”和分组值的列表,像这样(另外对键进行排序,但这对于本示例并不重要)
Take, (1)
this, (1)
input (1, 1)
etc...
如您所见,键 input
已被“简化”为单个元素,您可以循环遍历并对值求和并像这样发出
Take,1
this,1
input,2
etc...
【讨论】:
【参考方案2】:好问题。
如上所述,映射器输出(key, value)
对的序列,在这种情况下,每个单词的形式为(word, 1)
,reducer 接收分组为(key, <1,1,...,1>)
,总结列表中的术语并返回@ 987654328@。请注意,进行分组的是 而不是 reducer;这是 map-reduce 环境。
map-reduce programming model 与我们习惯使用的不同,在此模型中如何实现算法通常并不明显。 (例如,想想如何实现 k-means 聚类。)
我推荐 Leskovec 等人免费提供的 Mining of Massive Data Sets book 的第 2 章。另见the corresponding slides。
【讨论】:
感谢您的解释和资源 - 我会给那些书/幻灯片看看。以上是关于试图理解一个基本的 WordCount MapReduce 示例的主要内容,如果未能解决你的问题,请参考以下文章