概述
键值对构成了MapReduce的基本数据结构。键、值均可以是各种类型的数据,比如整型、浮点型、字符串甚至随机字节。当然,用户也可以定义他们自己的数据类型(类似于C++里面类的概念)
MapReduce包含Map和Reduce两个过程:
map执行过程:(k1,v1)→[(k2,v2)]
reduce
执行过程:(k2,[v2])→[(k3,v3)]([…]表示列表)
(1)对于mapper来说,输入的k1是文档ID,输入的v1是文档内容;输出的k2是字母,v2是该字母出现的次数;
(2)reducer的输入是经过分组的mapper的输出,输出的k3是字母,v3是经过聚集后字母出现的总次数;
(1)第一个mapper
统计出文档A中a有一个,b有两个;
(2)第二个mapper
统计出文档B有3个c,文档C有6个c;
(3)
聚合操作(可选):(c,3)和(c,6),它们经过聚合变成(c,9)
(4)
划分操作(可选):确定把哪些键给哪些reducer处理
(5)经过
排序,基于键对键值对进行
分组,reducer负责处理相应的结果
for all 单词t∈doc d do
输出(t,1)
Reduce 函数
输入:(key:单词t,value:单词个数{c1,c2,…})
for all c∈{ci,ca…} do
MapReduce执行过程总结
1)将输入的每个键值对放到mapper中执行,生成另一个键值对列表(中间结果);如(docid a,doc d)→[(term t,count1)];
2)中间结果按照键进行分组聚合;如(termt,[count1]);
3)将每一组放到一个reducer中执行,输出结果写入文件系统
a)reducer内对每一组按照键顺序处理,reducer之间并行运行
b)r个reducer将会生成r个输出文件。如(termt,[count 1])-[(term t,count num)]