MapReduce :Simpliyed Data Processing on Large Clusters 总结

来源:互联网 发布:多普达t5399软件 编辑:程序博客网 时间:2024/05/16 15:27
MapReduce:Simpliyed Data Processing on Large Clusters

(超大集群的简单数据处理)

*一.背景


1. 问题的提出

面对海量数据,如何处理并行计算、如何分发数据、如何处理错误等问题引发关注,而原本简单的计算处理由于这些问题的存在变得复杂,是否能找到一种方法来解决这个问题?

2. MapReduce的出现

为了解决上述问题,需要设计新的计算抽象模型:只要表述想要执行的运算,而屏蔽了并行计算、容错、数据分发、负载均衡等复杂细节,这些被封装在一个库里。于是,MapReduce框架模型应运而生了。

*二.编程模式


1.MapReduce编程模式

MapReduce是一个编程模式,它是与处理/产生海量数据集的实现相关。它的设计灵感来自于函数式语言的Map和Reduce原语。
Map:对输入数据应用Map操作得出一个中间<key, value>对集合。
Reduce:对具有相同key的value集合上应用Reduce操作合并中间结果。

2.实现的目标

通过简单接口(用户只要实现Map和Reduce函数)实现大规模数据的分布式计算,实现在大量普通机器上的高性能计算。

3.例子

计算一个大文档集合中每个单词的出现次数。伪代码:
map(String key, String value): // key:document name
for each word w in value:           // value:document contents
EmitIntermediate(w,"1");


reduce(String key, Iterator values):  //key: a word
int result = 0;                                             // values: a list of counts
for each v in values:
result +=ParseInt(v);

Emit(AsString(result));


map函数输出文档每个词(key)这个词的出现次数(value,这里为1)。
reduce函数将每个词的出现次数累加起来输出。


*三.实现


1.实现方式

MapReduce模型有多种不同实现方式,取决于具体环境,如小型的共享内存机器、大型网络连接集群等。


2.执行阶段概括

1)Map阶段:输入数据自动分割为M个片段集合,Map调用后分到多台机器上并行处理。


2)Reduce阶段:使用分区函数将Map输出的key值分成R个分区(如hash(key)mod R),使得Reduce调用也被分到多台机器并行处理。这里分区数R和分区函数作为一个重要指标,由用户来指定。


3.具体实现步骤

1)用户调用MapReduce库将输入文件分为M个数据片段,从性能方面考虑一般M的大小为16-64M。
2)用户程序有一个Master(主控程序),其他都为Worker,由Master负责任务分配。
3)被分配了Map任务的Map Worker读取数据片段,将其解析出<key, value>对传递给用户map函数处理,最后输出中间<key,value>对到内存的缓冲区。
4)缓存的<key, value>对通过分区函数分成R个分区,周期性写入本地磁盘,并将位置信息上传给Master。Master再将这些存储位置传给Reduce Worker。
5)ReduceWorker接收到信息后,使用RPC将落地的<key,value>对读取到本地,对Key排序后聚合相同Key值的数据,然后将<key, list<value>>对传递给用户reduce函数处理,最后输出到所属分区的输出文件(故最终的MapReduce输出为R个文件)。





*四.性能


1.性能的衡量

在一个大型集群上运行的两个计算衡量MapReduce的性能。一个计算用来在一个大概1TB的数据中查找特定的匹配串。另一个计算排序大概1TB的数据,之所以使用这两个计算是因为这两个程序代表了很多的用MapReduce实现真实的程序的主要类型。

2.结果

      由测试的数据可反映如下情况:
1)输入速度比输出速度快。因为本地化的优化策略,绝大部分数据都是从本地硬盘读取而省去了相关的网络消耗。
2)排序速度比输出速度快。因为输出阶段写了两份排序后的速度(写两份的原因是为了可靠性和可用性的原因)。


*五.经验


1.MapReduce库能广泛应用于我们日常工作遇到的各类问题,在各个领域应用广泛,如数据挖掘,大规模机器学习、网页信息提取、大规模图形计算等。

2.MapReduce的成功取决于快速写出一个简单的程序,就能在上千台机器的集群上做大规模并发处理,极大加快了设计和开发周期;而且完全可以让没有分布式/并行处理开发经验的程序员利用大量资源,开发出分布式/并行处理的应用。

3.MapReduce最成功的应用就是重写了Google搜索服务所使用的Index系统(大规模索引),使用MapReduce带来了代码简单小巧、高性能、操作管理更简单的优点。

原创粉丝点击