这些 map 操作都是运算在输入记录的每个逻辑”record”上,并且 map 操作为了产生一组中间的
key/value 键值对,并且接着在所有相同 key 的中间结果上执行 reduce 操作,这样就可以合并适当
的数据。我们得函数模式是使用用户定义的 map 和 reduce 操作,这样可以让我们并发执行大规
模的运算,并且使用重新执行的方式作为容错的优先机制。
MapReduce 的主要贡献在于提供了一个简单强大的接口,通过这个接口,可以把大尺度的计算自
动的并发和分布执行。使用这个接口,可以通过普通 PC 的巨大集群,来达到极高的性能。
第二节讲述了基本的编程模式,并且给出了一些例子。第三节讲述了一个面向我们基于集群的计
算环境的 MapReduce 的实现。第四节讲述了一些我们建议的精巧编程模式。第五节讲述了在不
同任务下我们的 MapReduce 实现的性能比较。第六节讲述了在 Google 中的 MapReduce 应用以
及尝试重写了我们产品的索引系统。第七节讲述了相关工作和未来的工作。
2 编程模式
我们的运算处理一组输入的(input)键值对(key/valuepairs),并且产生一组输出的(output)键
值对。MapReduce 函数库的用户用两个函数来表达这样的计算:Map 和 Reduce。
Map 函数,是用户自定义的的函数,处理输入的键值对,并且产生一组中间的(intermediate)键
值对。MapReduce 函数库稽核所有相同的中间键值键 I 的值,并且发送给 Reduce 函数进行处理。
Reduce 函数同样也是用户提供的,它处理中间键值 I,以及这个中间键值相关的值集合。这个函
数合并这些值,最后形成一个相对较小的值集合。通常一个单次 Reduce 执行会产生 0 个或者 1
个输出值。提供给 Reduce 函数的中间值是通过一个 iterator 来提供的。这就让我们可以处理超过
内存容量的值列表。
2.1 例子
我们考虑这样一个例子,在很大的文档集合中通机每一个单词出现的次数。我们写出类似如下的
伪代码:
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):
第 2 页
评论2
最新资源