1 define wordCount as Multiset;
2 for each document in documentSet
3 {
4 T = tokenize(document);//分词
5 for each token in T
6 {
7 wordCount[token]++;//多重集合
8 }
9 }
10 display(wordCount);
根据我们的分布式计算的思想,我们可以让工作分布在多台机器上,每台机器只需处理需要统计的文章的一小断,当所有的机器都完成时,第二个处理阶段将在主节点服务器中合并这些结果。
第一阶段要分布到多台计算机的伪代码:
1 define wordCount as Multiset;
2 for each document in documentSubset
3 {
4 T = tokenize(document);
5 for each token in T
6 {
7 wordCount[token] ++;
8 }
9 }
10 sentToSecondPharse(wordCount);//把分到的文章片段的统计结果发送到上一级
第二阶段的伪代码为:
1 define totalWordCount as Multiset;
2 for each wordCount received from firstPharse
3 {
4 multisetAdd(totalWordCount,wordCount);//把各个节点传送过来的片段统计合并为totalWordCount
5}
在MapReduce框架中编写应用程序就是定制化mapper和reducer的过程,他们使用列表和键/值对作为主要的元数据,键与值通常为整数或者字符串,也可以为可忽略的假值,或者是复杂的对象类型。这样说可能有点抽象,我举个实际的例子:
如果我们有两个文件要进行单词统计,那么map函数的输入是list(),就是一个列表,列表里面包含了两个键值对,一个是,一个是,当我们这台计算机通过这我们先前编写的map函数对这两个文件进行分析处理后,会返回输出list(),每个单词是键,其出现的次数是值,就是一个类似于 这样的键值对列表,或者是 ..的列表。这样所有的输出都会被聚合到一个包含的巨大列表中,当所有节点的数据统计结果返回到主节点的时候,系统会让相同的word组织起来形成一个新的键值对,框架让reduce来分别处理每一个,我们只需要在reduce函数中实现把list(int)列表中的全部数字相加就行了,reduce也会返回一个结果,list;这样我们就完成了统计。
输入
输出
map
list()
reduce
list()
单词统计中map和reduce函数的伪代码:
1 map(String filename,String document)
2 {
3 List T = tokenize(document);
4 for each token in T
5 {
6 emit ((String)token,(Integer) 1);//逐个生成列表中的元素
7 }
8 }
9 reduce(String token,List values)
10 {
11 Integer sum = 0;
12 for each value in values
13 {
14 sum = sum + value;
15 }
16 emit ((String) token,(Integer) sum);
17 }