map/reduce的概念

MapReduce是一种处理大规模数据的编程模型,用户通过定义Map和Reduce函数来实现数据处理。Map函数处理输入键值对产生中间键值对,Reduce函数合并相同中间键的值。文中介绍了MapReduce的执行流程、数据结构、容错机制、优化方法,以及在Google集群中的高性能实现。此外,还讨论了分区函数、排序保证、组合器函数、输入输出类型等编程模型的改进。
摘要由CSDN通过智能技术生成

《MapReduce: Simplified Data Processing on Large Cluster 》翻译

MapReduce是一种编程模型和一种用来处理和产生大数据集的相关实现。用户定义map函数来处理key/value键值对来产生一系列的中间的key/value键值对。还要定义一个reduce函数用来合并有着相同中间key值的中间value。许多现实世界中的任务都可以用这种模型来表达,就像下文所展示的那样。

用这个风格编写的程序可以自动并行地在集群上工作。运行时系统会自动处理例如切割输入数据,在机器之间调度程序的执行,处理机器故障以及管理必要的机器间通信等细节问题。这可以让那些对于并行分布式系统没有任何经验的程序员也能简单的利用起一个大的分布式系统的资源。

我们的MapReduce的实现运行在一个由大的商业机构成的集群当中并且是高度可扩展的:一个典型的MapReduce计算要在上千台机器中处理TB数量级的数据。程序员会觉得这个系统非常好用:已经有成千上万的MapReduce程序被实现出来并且每天有上千个MapReduce任务运行在Google的集群上。

Introduction

在过去五年中,作者和许多Google的其他人已经实现了成百上千个用于特殊目的的计算程序用于处理大量的raw data,各种各样的derived data。许多这种计算程序在概念上都是非常直接的。然而输入的数据量往往很大,并且计算需要分布在成百上千台机器中为了在一个可接受的时间内完成任务。但是除了简单的计算模型以外,我们需要大量复杂的代码用来处理例如如何并行化计算、分发数据、处理故障等等问题。

为了解决这样的复杂性,我们设计了一种新的抽象,它让我们只需要表示出我们想要执行的计算模型,而将背后复杂的并行化,容错,数据分发,负载平衡等等技术的实现细节隐藏在了库中。我们这种新的抽象是受Lisp以及其他一些函数式编程语言中的map和reduce原语影响而来的。我们意识到许多的计算都需要对于输入中的每个逻辑“记录”进行map操作,为了计算一系列的中间键值对。然后还需要对所有共享同一个key的value进行reduce操作,从而能够对派生的数据进行适当的组合。我们这种让用户自定义map和reduce操作的编程模型能够让我们简单地对大量数据实现并行化,并且使用重新执行作为主要的容错机制。

我们这项工作的主要共享是提供了一个简单并且强大的接口能够让我们实现自动的并行化并且分布处理大规模的计算,同时该接口的实现能在大型的商用PC集群上获得非常高的性能。

Section 2描述了基本的编程模型以及一些简单的例子。Section 3描述了为我们的基于集群的计算环境量身定做的MapReduce接口。Section 4描述了一些我们认为有用的对于编程模型的改进。Section 5是对我们的实现在不同任务下的性能测试。Section 6 包含了MapReduce在Google内的使用情况,包括我们以它为基础重写我们的产品索引系统的经验。Section 7讨论了相关的工作以及未来的发展。

2 Programming Model

计算模型以一系列的键值对作为输入并产生一系列的键值对作为输出。MapReduce库的用户以“Map”和"Reduce"两个函数来表达计算。

Map,是由用户编写的,获取一个输入对,并且产生一系列中间的键值对。MapReduce库将那些具有相同的中间键I的中间值聚集在一起,然后将它们传递给Reduce函数。

Reduce函数同样是由用户编写的,接收一个中间键I和该键对应的一系列的中间值。Reduce函数通过将这些值合并来组成一个更小的值的集合。通常每个Reduce函数只产生0个或1个输出值。Reduce函数一般通过一个迭代器来获取中间值,从而在中间值的数目远远大于内存容量时,我们也能够处理。

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, 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函数为在每一个单词出现的时候,为它加上一个计数(在这个简单的例子中就是加1)。Reduce函数对每个单词的所有计数进行叠加。

另外,用户需

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值