简介
Mapreduce,一种编程模型,也可以说是一个处理和生成超大数据集的算法模型的相关实现。首先用户要创建一个Map函数,用来处理一个基于
key/value pair的数据集合,以输出中间的机遇key/value pair的数据集合;然后再创建Reduce函数用来将所有的具有相同中间key值的中间value值。
,文档抓取(类似网络爬虫的程序)、web请求日志等等;也为了计算处理各种类型的衍生数据,比如倒排索引、web文档的图结构的各种表示形式、每台主机上网络爬虫抓取的页面数量的汇总、每天被请求的最多的查询的集合等等。大多数这样的数据处理运算在概念上很容易理解。然而由于输入的数量巨大,因此想要在可接受的时间内完成运算,只有将这些计算分布在成百上千的主机上。如何处理并行计算、如何分发数据、如何处理错误?这些问题综合在一起,需要大量的代码处理,因此也使得原本简单的运算变得难以处理。
为了解决上述问题,我们设计一个新的抽象模型,使用这个抽象模型,我们只要表述我们想要执行的简单运算即可,而不必关心并行计算、容错、数据分布、负载均衡等复杂的细节,这些问题都被封装在了一个库里面。设计这个抽象模型的灵感来自Lisp和许多其他函数式语言的Map和Reduce的原语。我们意识到大多数的运算都包含这样的操作:在输入数据的“逻辑”记录上应用Map操作得出一个中间key/value pair集合,然后再所有具有相同Key值的value值上应用Reduce函数,我们就可以非常容易的实现大规模并行化计算;通过MapReduce模型自带的“再次执行”(re-execution)功能,也提供了初级的容灾实现方案。
MapReduce框架模型的主要贡献就是通过简单的接口实现自动的并行化和大规模的分布式计算,通过使用MapReduce模型接口实现在大量普通的PC机上的高性能计算。
MapReduce可以做什么:
- 统计一个文档中每个word出现的次数
- 给文档集建立倒排索引
- 从一次crawled的web数据里构建出一个反向web graph
统计各网页的搜索次数
具体表现在:读入数据:key/value对的记录格式数据
- Map:从每个记录里extract something
- Shuffle:混排交换数据,即把中间结果汇集到相同节点上
- Reduce:归并某一个key的所有values,进行计算;输出合并的计算结果(常常只有一个)
- 输出结果
伪代码实现
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
//value:a list of counts
int result = 0;
for each v in values:
result += ParseInt(v);
Emit(AsString(result));
Map函数输出文档中的每个词、以及这个词出现的次数(在这个简单的例子里就是1)。Reduce函数把Map函数产生的每一个特定的词计数累计起来。