vlambda博客
学习文章列表

从单词统计看MapReduce

概述

键值对构成了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负责处理相应的结果
单词次数统计问题
输入:文档集合
输出:文档集合中每个单词出现的次数
简单算法实现
Map函数
输入;(key:文档a,value:文档内容d)
输出:(key:单词t,value:1)
过程:

for all 单词t∈doc d do

    输出(t,1)

Reduce 函数

输入:(key:单词t,value:单词个数{c1,c2,…})
输出:(key:单词t,value:单词总数)
过程:
sum=0

for all c∈{ci,ca…} do

    sum=sum+c
输出(t,sum)

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)]