MapReduce: Simplified Data Processing on Large Clusters

这篇文章主要介绍Map Reduce这种编程模型,它主要是由Map 操作和Reduce操作组成, Map操作把一系列的key/Value键值对影响生成中间结果,这些中间结果已经是根据关键字分好组。然后把中间结果传给Reduce操作,Reduce会根据关键字,把相同关键字的中间结果规约成规模更小的最终结果。


文章中举了个例介绍其工作原理:

例如有个任务需要计算在一堆文档中每个单词出现的频率,用户只需要提供Map函数和Reduce函数 的操作,例如:

map(String key, String value):

// key: document name

// value: document contents

for each word w in value:

EmitIntermediate(w, “1”);


reduce(String key, Iterator values):

// key: a word

// values: a list of counts

int result = 0;

for each v in values:

result += ParseInt(v);

Emit(AsString(result));


Map 操作的输入是 文档名 + 文档结果, 输出的中间结果是一个词w和该词出现的个数1。 然后MapReduce会把键相同(w) 的键值对传到给Reduce函数, Reduce最后把所有的值加起来,得到单词w的词频。然后输出到结果文件中。


工作流程图:





根据论文给出的图,如上:

1.MapReduce库先把user program的输入文件划分为M份(M为用户定义),每一份通常有16MB到64MB,如图左方所示分成了split0~4;然后使用fork将用户进程拷贝到集群内其它机器上。
2.user program的副本中有一个称为master,其余称为worker,master是负责调度的,为空闲worker分配作业(Map作业或者Reduce作业),worker的数量也是可以由用户指定的。
3.被分配了Map作业的worker,开始读取对应分片的输入数据,Map作业数量是由M决定的,和split一一对应;Map作业从输入数据中抽取出键值对,每一个键值对都作为参数传递给map函数,map函数产生的中间键值对被缓存在内存中。
4.缓存的中间键值对会被定期写入磁盘中,而且被分为R个区,R的大小是由用户定义的,将来每个区会对应一个Reduce作业;这些中间键值对的位置会被通报给master,master负责将信息转发给Reduce worker。
5.master通知分配了Reduce作业的worker它负责的分区在什么位置(肯定不止一个地方,每个Map作业产生的中间键值对都可能映射到所有R个不同分区),当Reduce worker把所有它负责的中间键值对都读过来后,先对它们进行排序,使得相同键的键值对聚集在一起。因为不同的键可能会映射到同一个分区也就是同一个Reduce作业(谁让分区少呢),所以排序是必须的,如果中间结果较大,需要使用外排。
6.reduce worker遍历排序后的中间键值对,对于每个唯一的键,都将键与关联的值传递给reduce函数,reduce函数产生的输出会添加到这个分区的输出文件中。
7.当所有的Map和Reduce作业都完成了,master唤醒正版的user program,MapReduce函数调用返回user program的代码。
当所有的操作完成后,会生成R个输出文件,每一个Reduce task一个。用户通常不需要合并这R个文件,可以把这些结果交给另一个MapReduce函数作为输入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值