Abstract
MapReduce :
- programming model 编程模型
- an associated implementation for processing and generating large data sets.
用户只需要指定 Map(Map函数将 key/value 类型的 pair 生成中间结果的 pair) 和 Reduce 函数(Reduce 函数将所有具有相同中间结果的值组合起来)即可。
MapReduce 封装隐藏了分布式系统并行计算的细节:
- 输入数据的分割
- 计划将程序分配到一组计算机中
- 处理机器故障
- 管理集群内部的通信
程序(in functional style)分布式的运行在大型分布式的集群上,而且具有很好的可伸缩性 scalable。
Introduction
过去这些年,Google一直在寻找方法来实现处理大量数据(抓取到的文件,web日志等)的方法,通常数据量很大而且必须分散在数以千计的电脑上来进行运算。为了处理如何使计算相互关联,分配数据以及处理故障的问题,往往编写大量的复杂代码掩盖了他们,最初的简单计算的初衷却被忽略掉。
为了解决这种复杂性,抽象出了一个简单的计算模型放到一个库中,这个库隐藏了可能出现的问题:
- 并行计算
- 容错
- 数据分发
- 负载均衡
这个抽象受到了 Lisp
以及很多函数式编程语言中存在的原语 map
和 reduce
的启发。
大多数并行计算都包含两个步骤:
- map:将每个逻辑记录变成
key/value
的中间形式方便计算 - reduce:将所有具有相同
key
的值组合到一起来进行合适的处理
我们使用一个函数式的编程模型(functional programming model)可以让处理大型的并行计算和使用重新执行作为容错的主要机制变得很简单。
这项工作的主要贡献是:提供了一个简单但是很强大的接口(interface)让自动化的并行计算和大规模计算的分发成为可能,结合该接口的实现,可以在商用机的大型集群上实现高性能。
Section2 :描述了基本的编程模型给出几个例子
Section3 :描述MapReduce
接口针对集群运算环境的实现
Section4 :一些针对该模型的细微的改良
Section5 :针对实现设计出一系列性能衡量方法
Section6 :MapReduce
在 Google 中的使用,以及使用 MapReduce 来重写生产环境的索引系统
Section7 :相关以及未来的工作
2 Programming Model
input: a set of key/value
pairs
output: a set of key/value
pairs
MapReduce 的用户将只会使用两个函数 Map
和 Reduce
。
Map
:用户编写,将输入的 pair 变成 k/v
的中间 pairs,然后 MapReduce 会把具有相同 key 的 pair 送给 Reduce
函数
Reduce
: 用户编写,接受中间结果 key 和 key 的一系列值。将这些值组合起来成为更少的 k/v
;通常每个 Reduce 函数只输出一个 或者 0 个值。中间结果太多无法全部放到内存中,可以通过迭代的方法来处理大量的 value
2.1 Example
设想一个需要统计文件中每个单词数量的一个问题,我们很可能编写这样的代码:
map(String key, String value):
// key: document name
// value: document contents
for each word w in value:
EmitIntermediate(w, "1")
reduce(String key, String values):
// key: a word
// values: a list of counts
int result = 0
for each v in values
result += ParseInt(v)
Emit(AsString(result