Google 经典论文MapReduce

摘要

MapReduce是处理和生成大型数据集的编程模型和相关实现。用户指定处理键/值对以生成中间键/值对的映射函数,以及合并与同一中间键关联的所有中间值的reduce函数。如文中所示,该模型可以表达现实世界中的许多任务。

 

在该功能样式中编写的程序是自动并行化和执行的大型自定义计算机。运行时系统负责划分输入数据、跨一组机器调度程序执行、处理机器故障和管理所需的机器间通信的细节。这使得没有任何并行和分布式系统经验的程序员能够轻松地利用大型分布式系统的资源。

 

我们的MapReduce实现运行在一个大型的商用机器集群上,并且具有高度的可伸缩性:典型的MapReduce计算在数千台机器上处理许多兆字节的数据。程序员发现了系统的复杂性:每天在谷歌的集群上执行一千个MapReduce作业的数量超过了100%。

 

简介:

在过去的五年中,作者和谷歌的许多其他人已经实现了数百种特殊用途的计算,这些计算处理大量原始数据,如爬网文档、web请求日志等,以计算各种派生数据,如倒排索引、web文档的图形结构的各种表示,每个主机爬网的页数摘要,给定主机中最频繁的查询集

天,等等。大多数这样的计算在概念上是直接的。然而,输入数据通常很大,为了在合理的时间内完成,计算必须分布在成百上千台机器上。如何并行计算、分布数据和处理失败的问题,共同掩盖了原始的简单计算和大量复杂的代码来处理这些问题。

 

作为对这种复杂性的一种反应,我们设计了一个新的抽象,它允许我们扩展我们试图执行的简单计算,但隐藏了库中并行化、容错、数据分布和负载平衡的混乱细节。我们的抽象是受Lisp和许多其他函数语言中的map和reduce原语启发的。我们意识到,我们的大多数计算都涉及对输入中的每个逻辑“记录”应用map操作,以便计算一组中间键/值对,然后对共享同一键的所有值应用reduce操作,以便适当地组合派生数据。我们使用功能模型和用户指定的map和reduce操作,使我们能够轻松地并行化大型计算,并将重新执行作为容错的主要机制。

 

这项工作的主要贡献是一个简单而强大的接口,它能够自动并行和分配大规模计算,并结合这个接口的实现,实现了高性能的大型商用pc集群

 

第二节描述了基本程序模型,并给出了几个例子。第3节描述了为我们基于集群的计算环境定制的MapReduce接口的实现。第4节描述了我们发现有用的编程模型的几个优点。第5节对各种任务的实现进行了性能度量。第6节探讨在Google中使用MapReduce,包括我们在usingit中的经验作为基础重写我们的产品索引系统。第7节讨论了相关和未来的工作。

 

2 Programming Model

该计算将查找输入键/值对,并生成一组输出键/值对。Map Reducelibrary的用户将计算表示为两个函数:Map和duce。Map由用户编写,它接受一个输入对并生成一组中间键/值对。Map Reduce库组将与同一个中间键I关联的所有中间值聚集在一起,并将它们传递给Reduce函数。Reduce函数也由用户编写,它接受一个中间键I和该键的一组值。它将这些值合并在一起,形成一个可能更小的值集。通常每次Reduce调用只产生0或1个输出值。中间值通过迭代器提供给用户的reduce函数。这允许我们处理内存中太大的值列表。

 

2 Example

考虑一下在大量文档中计算每个单词出现次数的问题。用户将编写类似于以下伪代码的代码:

map函数发出每个单词加上相关的出现次数(在这个简单的例子中只有“1”)。reduce函数将为特定单词发出的所有计数相加。此外,用户使用输入和输出文件的名称以及可选的调整参数将代码写入mapreduce Specification对象。然后,用户调用MapReduce函数,将specifionobject传递给它。用户的ScDeSink链接到MapReduce库(在C++中实现)。附录A包含本例的完整程序文本。

 

2.2 Types

即使先前的伪代码是以字符串输入和输出的形式编写的,但从概念上讲,用户提供的map和reduce函数有相关的类型:map(k1,v1)→list(k2,v2)reduce(k2,list(v2))→list(v2),即,输入键和值是从与输出键和值不同的域中提取的。此外,中间键和值与输出键和值来自同一域。我们的C++实现将字符串传递到用户DE-IEND函数,并将其留给用户代码来转换字符串和适当的类型。

 

2.3更多的例子

下面是一些有趣的程序的简单示例,可以很容易地表示为MapReduce计算。

分布式grep:如果map函数与提供的模式匹配,它将发出一行。reduce函数是一个标识函数,它只将提供的中间数据复制到输出。

URL访问频率计数:map函数处理网页请求日志并输出hURL,1i。reduce函数将同一URL的所有值相加,并发出hURL,total counti对。

 

 

Reverse Web LinkGraph:mapfunctionout为指向在名为source的页面中找到的目标URL的每个链接放置htarget、sourcei对。reduce函数连接与给定目标URL相关联的所有源URL的列表,并发出一对:htarget,list(source)

 

 

术语向量器主机:向量器将文档或一组文档中出现的最重要的单词作为单词、频率ipairs的列表进行摘要。map函数为每个输入文档(其中主机名是从文档的URL中提取的)发出一个hhostname,term vectori对。reduce函数传递给给定主机的所有每个文档术语向量。它将这些术语向量相加,丢弃不常用的术语,然后发出最终hhostname,术语向量对。

 

反向索引:map函数解析每个文档,并发出一系列单词、文档IDi对。reduce函数接受给定单词的所有对,对相应的文档ID进行排序,并提交一个hword、list(document ID)ipair。这些tofalloutput pairs forms将执行invertedindex。它是为了使这个计算保持对单词位置的跟踪

 

分布式排序:map函数从每个记录中提取密钥,并发出ah密钥recordipair。reduce函数发出的所有对保持不变。此计算取决于第4.1节中描述的分区功能和第4.2节中描述的属性。

 

3.  Implementation(执行)

MapReduce接口的许多不同实现是可能的。正确的选择取决于环境。例如,一种实现可能适用于小型共享内存计算机,另一种适用于大型NUMA多处理器,另一种适用于更大的网络计算机集合。

 

本节描述了一个针对Google广泛使用的计算环境的实现:

与交换以太网连接的大量商品[4]。在我们的环境中:

 

 

(1) 运行Linux的机器是典型的双处理器或x86处理器,带有2-4 GB内存类型机。(2) 使用的是普通的网络硬件——通常是100兆位/秒或1千兆位/秒(在机器级别),但是平均的总分块带宽要少得多。(3) 集群由成百上千台机器组成,因此机器故障很常见。(4) 存储由直接连接到各个机器的廉价IDE磁盘提供。在家中开发的分布式文件系统[8]用于管理存储在这些磁盘上的数据。文件系统使用复制在不可靠的硬件上提供可用性和可靠性。(5) 用户将作业提交到调度系统。每个作业都包含多个任务,并由调度程序添加到群集中的一组可用计算机上。

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值