谷歌(Google)三大亚湾原子核能发电站心技术

Google MapReduce中文版

    译者: alex

 

摘要

MapReduce是二个编制程序模型,也是八个甩卖和转变超大数据集的算法模型的有关兑现。用户率先创制三个Map函数处理多个基于key/value
pair的多寡集合,输出中间的根据key/value
pair的数量集合;然后再创立八个Reduce函数用来归并全体的具备相同中间key值的中档value值。现实世界中有众多满意上述处理模型的例证,本杂谈将详细描述那些模型。

 

MapReduce架构的主次能够在大气的家常布局的微处理器上达成并行化处理。这些系列在运维时只关心:如何划分输入数据,在大气处理器组成的集群上的调度,集群中总结机的错误处理,管理集群中计算机之间须求的通讯。选取MapReduce架构能够使那些从没并行计算和分布式处理系统开发经历的程序员有效应用分布式系统的丰盛资源。

 

大家的MapReduce达成运营在规模足以灵活调整的由一般性机器组成的集群上:三个独占鳌头的MapReduce计算往往由几千台机器组成、处理以TB总结的多少。程序员发现这些类别万分好用:已经完毕了许许多多的MapReduce程序,在谷歌的集群上,每一日都有1000八个MapReduce程序在实施。

1、介绍

在过去的5年里,包蕴本文小编在内的谷歌(Google)的多多程序员,为了处理海量的本来数据,已经落到实处了不可预计的、专用的盘算办法。这么些计算格局用来拍卖大量的原本数据,比如,文书档案抓取(类似互联网爬虫的先后)、Web请求日志等等;也为了总计处理各连串型的衍生数据,比如倒排索引、Web文书档案的图结构的各类表示时势、每台主机上网络爬虫抓取的页面数量的集聚、每一天被呼吁的最多的查询的集纳等等。大部分那样的数码处理运算在概念上很简单精晓。不过由于输入的数据量巨大,由此要想在可接受的时日内成功运算,唯有将那一个总括分布在广大的主机上。如何处理并行总计、如何分发数据、怎么样处理错误?全部这么些题材归咎在共同,必要大量的代码处理,由此也使得原本不难的演算变得难以处理。

 

为了消除上述复杂的问题,大家统一筹划一个新的抽象模型,使用这些抽象模型,我们假诺揭橥大家想要执行的简练运算即可,而无需关切并行总计、容错、数据分布、负载均衡等复杂的细节,这几个标题都被封装在了八个Curry面。设计这些抽象模型的灵感来源Lisp和成千上万其它函数式语言的Map和Reduce的原语。咱们发现到大家大部分的演算都富含那样的操作:在输入数据的“逻辑”记录上使用Map操作得出2个中档key/value
pair集合,然后在富有拥有同等key值的value值上利用Reduce操作,从而达成统第一中学间的数额,拿到四个想要的结果的目标。使用MapReduce模型,再组成用户完结的Map和Reduce函数,大家就能够万分不难的贯彻科学普及并行化计算;通过MapReduce模型自带的“再一次实施”(re-execution)功用,也提供了初级的容灾完成方案。

 

那一个工作(完结多个MapReduce框架模型)的第贰进献是透过不难的接口来促成活动的并行化和周边的分布式计算,通过接纳MapReduce模型接口完结在大气常备的PC机上高质量总计。

 

第1片段讲述基本的编制程序模型和部分运用案例。第一有个别讲述了一个透过裁剪的、适合大家的依据集群的乘除环境的MapReduce达成。第④局地讲述大家认为在MapReduce编制程序模型中有个别实用的技巧。第4部分对于各样差别的职务,度量我们MapReduce完结的特性。第4有的揭穿了在谷歌内部怎么样行使MapReduce作为基础重写大家的目录系统成品,包蕴别的一些行使MapReduce的经历。第⑩有个别斟酌相关的和前途的干活。

贰 、编制程序模型

MapReduce编制程序模型的法则是:利用贰个输入key/value
pair集合来产生3个输出的key/value
pair集合。MapReduce库的用户用三个函数表达那一个计算:Map和Reduce。

 

用户自定义的Map函数接受三个输入的key/value
pair值,然后发生2个中路key/value
pair值的聚合。MapReduce库把具有拥有同样中间key值I的中间value值集合在一块儿后传递给reduce函数。

 

用户自定义的Reduce函数接受2个中等key的值I和连锁的1个value值的集合。Reduce函数合并那几个value值,形成2个较小的value值的聚合。一般的,每一趟Reduce函数调用只爆发0或三个出口value值。经常我们透过三个迭代器把高级中学级value值提要求Reduce函数,那样大家就足以处理无法全部放入内部存储器中的大度的value值的集结。

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):
    // 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函数把Map函数发生的每叁个一定的词的计数累加起来。

 

别的,用户编写代码,使用输入和输出文件的名字、可选的调试参数来形成三个符合MapReduce模型规范的对象,然后调用MapReduce函数,并把那个标准指标传递给它。用户的代码和MapReduce库链接在一块儿(用C++完成)。附录A包括了这几个实例的漫天程序代码。

2.2、类型

即便在前面例子的伪代码中利用了以字符串表示的输入输出值,可是在概念上,用户定义的Map和Reduce函数都有相关联的门类:
map(k1,v1) ->list(k2,v2)
  reduce(k2,list(v2)) ->list(v2)
譬如,输入的key和value值与出口的key和value值在品种上演绎的域差异。其它,中间key和value值与输出key和value值在项目上演绎的域相同。

(alex注:原来的书文中这几个domain的意义不是很领会,小编参考Hadoop、KFS等落到实处,map和reduce都应用了泛型,因而,作者把domain翻译成类型推导的域)。 大家的C++中央银行使字符串类型作为用户自定义函数的输入输出,用户在和谐的代码中对字符串实行适当的类型转换。

2.三 、更加多的事例

那边还有局地有趣的简要例子,能够很简单的运用MapReduce模型来表示:

  • 分布式的Grep:Map函数输出匹配有个别形式的一行,Reduce函数是三个恒等函数,即把高级中学级数据复制到输出。
  • 测算U景逸SUVL访问频率:Map函数处理日志中web页面请求的笔录,然后输出(ULANDL,1)。Reduce函数把相同U福特ExplorerL的value值都助长起来,发生(UPRADOL,记录总数)结果。
  • 倒转互连网链接图:Map函数在源页面(source)中搜寻全体的链接目的(target)并出口为(target,source)。Reduce函数把给定链接指标(target)的链接组合成1个列表,输出(target,list(source))。
  • 每种主机的检索词向量:检索词向量用贰个(词,频率)列表来概述出今后文书档案或文书档案集中的最要紧的有的词。Map函数为各类输入文书档案输出(主机名,检索词向量),个中主机名来自文书档案的UXC90L。Reduce函数接收给定主机的享有文书档案的追寻词向量,并把那么些招来词向量加在一起,屏弃掉低频的检索词,输出三个说到底的(主机名,检索词向量)。
  • 倒排索引:Map函数分析种种文书档案输出1个(词,文档号)的列表,Reduce函数的输入是3个给定词的具有(词,文档号),排序全数的文书档案号,输出(词,list(文书档案号))。全部的输出集合形成多个简约的倒排索引,它以一种简易的算法跟踪词在文书档案中的地点。
  • 分布式排序:Map函数从各种记录提取key,输出(key,record)。Reduce函数不改变任何的值。那几个运算信赖分区机制(在4.1讲述)和排序属性(在4.2描述)。

3、实现

MapReduce模型能够有各个分裂的落到实处格局。如何正确选取取决于具体的条件。例如,一种达成格局适用于小型的共享内部存款和储蓄器格局的机器,其它一种完结情势则适用于大型NUMA架构的多处理器的主机,而部分完成格局更适合大型的网络连接集群。

本章节描述三个适用于谷歌(Google)内部普遍应用的演算环境的完毕:用以太网调换机连接、由一般性PC机组成的巨型集群。在我们的环境里包涵:
1.x86架构、运营Linux操作系统、双处理器、2-4GB内部存款和储蓄器的机器。
2.通常的网络硬件装备,每一种机器的带宽为百兆或许千兆,可是远小于网络的平均带宽的八分之四。 (alex注:那里须要网络大方解释一下了)
3.集群中富含众多的机器,由此,机器故障是常态。
4.仓库储存为廉价的内置IDE硬盘。三个里头分布式文件系统用来管理存款和储蓄在这一个磁盘上的多寡。文件系统通过数量复制来在离谱的硬件上保障数据的可相信性和有效性。
5.用户提交工作(job)给调度连串。每种工作(job)都饱含一密密麻麻的天职(task),调度体系将那么些职责调度到集群中多台可用的机器上。

3.① 、执行李包裹含

透过将Map调用的输入数据自动分割为M个数据片段的聚合,Map调用被分布到多台机器上举办。输入的多寡片段能够在不一致的机器上并行处理。使用分区函数将Map调用产生的中档key值分成奥迪Q7个区别分区(例如,hash(key)
mod
奥迪Q5),Reduce调用也被分布到多台机械上推行。分区数量(CRUISER)和分区函数由用户来钦命。

必发bifa88手机客服端 1

图1出示了我们的MapReduce达成中操作的整个流程。当用户调用MapReduce函数时,将发生上面包车型客车一多级动作(上边包车型客车序号和图第11中学的序号一一对应):
1.用户程序首先调用的MapReduce库将输入文件分为M个数据片度,每种数据片段的大大小小相似从
16MB到64MB(能够通过可选的参数来决定种种数据片段的尺寸)。然后用户程序在机群中创立大气的次序副本。 (alex:copies
of the program还真难翻译)

2.这一个程序副本中的有贰个出奇的顺序–master。副本中其余的先后都以worker程序,由master分配职务。有M个Map职务和PAJERO个Reduce任务将被分配,master将二个Map职务或Reduce职责分配给1个悠闲的worker。
3.被分配了map任务的worker程序读取相关的输入数据片段,从输入的数量片段中分析出key/value
pair,然后把key/value
pair传递给用户自定义的Map函数,由Map函数生成并出口的中间key/value
pair,并缓存在内部存款和储蓄器中。
4.缓存中的key/value
pair通过分区函数分成凯雷德个区域,之齐国期性的写入到当地磁盘上。缓存的key/value
pair在该地球磁性盘上的仓库储存地点将被回传给master,由master负责把这几个囤积地方再传递给Reduce
worker。
5.当Reduce
worker程序接收到master程序发来的多寡存款和储蓄地点音讯后,使用陆风X8PC从Map
worker所在主机的磁盘上读取这一个缓存数据。当Reduce
worker读取了全数的高级中学级数据后,通过对key举办排序后使得全数相同key值的数码聚合在共同。由于广大不比的key值会映射到同一的Reduce使命上,由此必须进行排序。借使中间数据太大无法在内部存款和储蓄器中成就排序,那么就要在外表进行排序。
6.Reduce
worker程序遍历排序后的高级中学级数据,对于每二个唯一的中等key值,Reduce
worker程序将那么些key值和它相关的中档value值的集结传递给用户自定义的Reduce函数。Reduce函数的输出被追加到所属分区的出口文件。
7.当全部的Map和Reduce职分都做到之后,master唤醒用户程序。在这些时候,在用户程序里的对MapReduce调用才回来。

 

在中标达成职责之后,MapReduce的出口存放在PRADO个出口文件中(对应每个Reduce任务发生二个出口文件,文件名由用户钦定)。一般情形下,用户不必要将那帕杰罗个出口文件合并成四个文书–他们不时把这几个文件作为其它1个MapReduce的输入,只怕在其它1个得以处理多个分叉文件的分布式应用中动用。

3.二 、Master数据结构

Master持有一些数据结构,它存款和储蓄每3个Map和Reduce职分的情状(空闲、工作中或成就),以及Worker机器(非空闲职责的机械)的标识。

 

Master就好像一个数量管道,中间文件存款和储蓄区域的职分消息透过那几个管道从Map传递到Reduce。因而,对于各样已经到位的Map职分,master存款和储蓄了Map职务发生的CRUISER个中间文件存款和储蓄区域的大大小小和任务。当Map任务完毕时,Master接收到地方和分寸的翻新消息,这个音信被渐渐递增的推送给那多少个正在工作的Reduce职务。

3.3、容错

因为MapReduce库的安排初衷是应用由众多的机械组成的集群来拍卖超大规模的数码,所以,那么些库必须求能很好的处理机器故障。

worker故障 master周期性的ping每一个worker。假使在2个约定的时光限制内没有收受worker再次来到的消息,master将把那一个worker标记为失效。全数由这一个失效的worker实现的Map义务被重设为发端的悠闲状态,之后这一个职分就可以被安插给别的的worker。同样的,worker失效时正值周转的Map或Reduce义务也将被另行置为空闲状态,等待重新调度。

 

当worker故障时,由于已经达成的Map职分的输出存款和储蓄在那台机器上,Map职务的出口已不可访问了,由此必须重新履行。而一度形成的Reduce职务的出口存款和储蓄在大局文件系统上,因而不需求再度实施。

 

当二个Map任务首先被worker A执行,之后由于worker A失效了又被调度到worker
B执行,那个“重新履行”的动作会被打招呼给持有执行Reduce职务的worker。任何还并未从worker
A读取数据的Reduce任务将从worker B读取数据。

 

MapReduce能够拍卖大规模worker失效的情形。比如,在贰个MapReduce操作实践时期,在正在运作的集群上拓展互联网维护引起80台机械在几分钟内不足访问了,MapReduce
master只必要简单的再一次实施那3个不可访问的worker完毕的办事,之后继续执行未到位的天职,直到最后形成那么些MapReduce操作。

 

master失败
三个简易的解决办法是让master周期性的将下面描述的数据结构(alex注:指3.2节)必发bifa88手机客服端,的写入磁盘,即检查点(checkpoint)。借使那么些master职分失效了,能够从最后二个检查点(checkpoint)发轫起步另二个master进程。不过,由于唯有3个master进度,master失效后再回复是比较艰苦的,由此大家未来的贯彻是只要master失效,就搁浅MapReduce运算。客户能够检查到那么些情景,并且可以依照须求再行履行MapReduce操作。

 

在失效方面的处理机制
*
(alex注:原文为”semantics in the presence of failures”)*
当用户提供的Map和Reduce操作是输入鲜明性函数(即一律的输入产生同样的出口)时,大家的分布式实现在其余意况下的输出都和兼具程序尚未出现任何错误、顺序的实施发生的输出是平等的。

 

作者们依靠对Map和Reduce职务的出口是原子提交的来成功那几个特点。每一个工作中的任务把它的出口写到私有的目前文件中。各个Reduce职分生成1个这样的文本,而种种Map职务则生成Tiguan个这么的公文(二个Reduce任务对应一个文本)。当二个Map任务完结的时,worker发送2个暗含CR-V个权且文件名的做到音信给master。假使master从一个一度做到的Map义务重新接受到到八个完结音信,master将忽略那几个音讯;不然,master将那哈弗个公文的名字记录在数据结构里。

 

当Reduce任务成功时,Reduce
worker进度以原子的措施把一时文件重命名为末段的输出文件。倘若同二个Reduce职责在多台机械上推行,针对同1个最后的出口文件将有三个重命名操作实施。大家依靠底层文件系统提供的重命名操作的原子性来保管最后的文件系统状态只有包罗二个Reduce任务产生的多寡。

 

行使MapReduce模型的程序员能够很不难的了解他们先后的表现,因为我们当先1/2的Map和Reduce操作是无人不晓的,而且存在那样的3个实际:大家的失灵处理体制等价于一个一一的施行的操作。当Map或/和Reduce操作是不领悟的时候,我们提供就算较弱但是还是合理的处理机制。当使用非确定操作的时候,3个Reduce任务Evoque1的输出等价于一个非鲜明性程序顺序执行产生时的出口。可是,另3个Reduce职分福睿斯2的输出可能符合四个不等的非分明顺序程序执行发生的中华V2的出口。

 

设想Map职务M和Reduce任务GL450壹 、Koleos2的状态。大家设定e(Ri)是Ri已经交由的进行进程(有且仅有1个那样的履行进度)。当e(普拉多1)读取了由M一回实施发生的输出,而e(冠道2)读取了由M的另一遍实践产生的输出,导致了较弱的失效处理。

3.四 、存款和储蓄地方

在我们的持筹握算运转条件中,网络带宽是一个一定紧张的能源。大家通过尽量把输入数据(由GFS管理)存款和储蓄在集群中机器的地面磁盘上来节省互连网带宽。GFS把各个文件按64MB二个Block分隔,每一种Block保存在多台机械上,环境中就存放了多份拷贝(一般是三个拷贝)。MapReduce的master在调度Map职分时会考虑输入文件的职位消息,尽量将多少个Map义务调度在包罗相关输入数据拷贝的机械上执行;假若上述努力战败了,master将尝试在保留有输入数据拷贝的机器附近的机器上推行Map职责(例如,分配到2个和含有输入数据的机器在1个switch里的worker机器上实施)。当在1个丰硕大的cluster集群上运维大型MapReduce操作的时候,大部分的输入数据都能从地点机械读取,因而消耗卓殊少的互联网带宽。

3.伍 、任务粒度

如前所述,大家把Map拆分成了M个片段、把Reduce拆分成ENCORE个部分执行。理想图景下,M和昂科威应当比集群中worker的机械数量要多得多。在每台worker机器都举行大气的两样职责能够增长集群的动态的负荷均衡能力,并且可以加快故障复苏的速度:失效机器上执行的恢宏Map任务都足以分布到独具别的的worker机器上去执行。

 

不超过实际际,在大家的现实性达成中对M和XC90的取值都有一定的合理性限制,因为master必须执行O(M+帕杰罗)次调度,并且在内部存储器中保存O(M*卡宴)个状态(对影响内部存款和储蓄器使用的要素依然比较小的:O(M*Odyssey)块状态,大致每对Map任务/Reduce职务一个字节就足以了)。

 

更进一步,Haval值平时是由用户钦赐的,因为各类Reduce职分最终都会扭转3个单身的出口文件。实际运用时大家也同情于采纳适用的M值,以使得每一个单独职分都以拍卖差不多16M到64M的输入数据(那样,上边描写的输入数据本地存款和储蓄优化策略才最实惠),其它,大家把Odyssey值设置为大家想行使的worker机器数量的小的翻番。大家习以为常会用那样的比重来执行MapReduce:M=三千00,奇骏=4000,使用3000台worker机器。

3.六 、备用任务

潜移默化三个MapReduce的总执行时间最家常的要素是“落伍者”:在运算进程中,假使有一台机器花了不短的时光才水到渠成末段多少个Map或Reduce职责,导致MapReduce操作总的执行时间超过预期。出现“落伍者”的由来尤其多。比如:假诺2个机械的硬盘出了难题,在读取的时候要时常的开始展览读取纠错操作,导致读取数据的快慢从30M/s降低到1M/s。尽管cluster的调度系列在那台机械上又调度了别样的天职,由于CPU、内部存款和储蓄器、本地硬盘和网络带宽等竞争因素的留存,导致执行MapReduce代码的推行作用进一步缓慢。大家如今遇上的1个标题是由于机械的开始化代码有bug,导致关闭了的总计机的缓存:在那个机器上推行职责的习性和健康处境相差上百倍。

 

咱俩有1个通用的机制来压缩“落伍者”出现的景色。当2个MapReduce操作看似成功的时候,master调度备用(backup)职分进度来执行剩下的、处于处理中状态(in-progress)的任务。无论是最初的履行进度、仍然备用(backup)义务进程达成了任务,大家都把那几个职务标记成为已经完成。大家调优了那一个机制,平日只会占用比常规操作多多少个百分点的总计资源。大家发现使用那样的编写制定对于收缩超大MapReduce操作的总处理时间效果显着。例如,在5.3节描述的排序职责,在关门掉备用任务的气象下要多花二分之一的光阴完成排序职责。

 

4、技巧

虽说简易的Map和Reduce函数提供的基本功效已经能够满意大多数的测算须求,大家还是发掘出了一部分有价值的壮大功效。本节将讲述那些扩张作用。

4.1、分区函数

MapReduce的使用者常常会钦定Reduce职务和Reduce职责输出文件的数目(卡宴)。大家在中间key上利用分区函数来对数据开始展览分区,之后再输入到持续职分履行进度。二个缺省的分区函数是运用hash方法(比如,hash(key)
mod
揽胜)实行分区。hash方法能生出极度平衡的分区。不过,有的时候,其余的部分分区函数对key值实行的分区将卓殊实用。比如,输出的key值是U大切诺基Ls,我们愿意每一个主机的兼具条条框框保持在同多少个出口文件中。为了帮助类似的事态,MapReduce库的用户必要提供专门的分区函数。例如,使用“hash(Hostname(urlkey))
mod
奥德赛”作为分区函数就足以把拥有来自同2个主机的U凯雷德Ls保存在同3个输出文件中。

4.② 、顺序有限支撑

笔者们保险在给定的分区中,中间key/value
pair数据的拍卖顺序是遵从key值增量顺序处理的。那样的一一保障对各样分成生成2个不变的输出文件,那对于急需对出口文件按key值随机存取的选用尤其有意义,对在排序输出的数据集也很有帮衬。

4.3、Combiner函数

在好几景况下,Map函数发生的中等key值的双重数据会占十分的大的比例,并且,用户自定义的Reduce函数满意结合律和调换律。在2.1节的词数计算程序是个很好的事例。由于词频率倾向于2个zipf分布(齐夫分布),每一种Map职分将生出不少个那样的记录<the,1>。全部的那个记录将经过互联网被发送到1个单独的Reduce任务,然后由这么些Reduce任务把全数这个记录累加起来发生3个数字。我们允许用户钦点1个可选的combiner函数,combiner函数首先在该地将那么些记录进行2回联合,然后将统一的结果再经过网络发送出去。

 

Combiner函数在每台执行Map职分的机械上都会被实践2次。一般情形下,Combiner和Reduce函数是同等的。Combiner函数和Reduce函数之间唯一的界别是MapReduce库咋样控制函数的输出。Reduce函数的出口被保存在最终的出口文件里,而Combiner函数的输出被写到中间文件里,然后被发送给Reduce职分。

 

一对的联合中间结果能够显着的滋长部分MapReduce操作的进程。附录A包涵3个使用combiner函数的事例。

4.④ 、输入和出口的类型

MapReduce库支持二种分歧的格式的输入数据。比如,文本方式的输入数据的每一行被视为是3个key/value
pair。key是文本的偏移量,value是那一行的剧情。其它一种普遍的格式是以key实行排序来存款和储蓄的key/value
pair的行列。各类输入类型的实现都必须能够把输入数据分割成数据片段,该多少片段能够由单独的Map义务来举办一连处理(例如,文本格局的限定划分必须确认保障险单独在每行的疆界进行限制划分)。即便抢先三分一MapReduce的使用者仅仅使用很少的预订义输入类型就知足须要了,可是使用者照旧得以透过提供2个简短的里德r接口完结就可见帮助五个新的输入类型。

 

里德r并非一定要从文件中读取数据,比如,大家得以很简单的实现贰个从数据Curry读记录的里德r,可能从内部存款和储蓄器中的数据结构读取数据的Reader。

就像的,大家提供了一部分预订义的输出数据的档次,通过那几个预约义类型能够发生不一致格式的数额。用户使用类似添加新的输入数据类型的艺术充实新的出口类型。

4.5、副作用

在一些情状下,MapReduce的使用者发现,尽管在Map和/或Reduce操作进度中加进援救的出口文件会比较便利。大家依靠程序writer把那种“副功用”变成原子的和幂等的(alex注:幂等的指1个连连发出同样结果的数学生运动算)。日常应用程序首先把出口结果写到贰个权且文件中,在输出全体多少未来,在选拔系统级的原子操作rename重新命名那么些方今文件。

 

假定1个职务发生了五个出口文件,大家从未提供类似两品级提交的原子操作帮助那种景色。因而,对于会生出四个出口文件、并且对于跨文件有一致性要求的职分,都不可能不是强烈的天职。然而在骨子里行使进度中,那么些界定还从未给我们带来过勤奋。

4.陆 、跳过损坏的笔录

偶尔,用户程序中的bug导致Map可能Reduce函数在拍卖某个记录的时候crash掉,MapReduce操作无法顺遂完毕。惯常的做法是修复bug后再行实施MapReduce操作,不过,有时候找出那些bug并修复它们不是一件不难的事体;那几个bug恐怕是在第叁方Curry边,而小编辈手下没有这几个库的源代码。而且在不少时候,忽略一些非常的笔录也是足以接受的,比如在一个宏伟的数额集上进行总括分析的时候。大家提供了一种实施格局,在那种情势下,为了保险担保一切处理能一连展开,MapReduce会检查和测试哪些记录导致鲜明性的crash,并且跳过这一个记录不处理。

 

种种worker进度都设置了信号处理函数捕获内部存款和储蓄器段分外(segmentation
violation)和总线错误(bus
error)。在履行Map或许Reduce操作在此以前,MapReduce库通过全局变量保存记录序号。即使用户程序触发了3个系统信号,新闻处理函数将用“最后一口气”通过UDP包向master发送处理的末段一条记下的序号。当master看到在处理某条特定记录不断退步一遍时,master就标明着条记下需求被跳过,并且在下次再度履行相关的Map恐怕Reduce职分的时候跳过那条记下。

4.⑦ 、本地执行

调剂Map和Reduce函数的bug是十分拮据的,因为实在执行操作时不仅是分布在系统中施行的,而且平常是在好几千台电脑上执行,具体的实践职位是由master进行动态调度的,这又大大扩大了调剂的难度。为了简化调节和测试、profile和小框框测试,大家开发了一套MapReduce库的当地完成版本,通过选用当地版本的MapReduce库,MapReduce操作在地面电脑上各种的实施。用户能够操纵MapReduce操作的实践,能够把操作限制到特定的Map职分上。用户通过设定专门的申明来在当地执行他们的程序,之后就能够很简单的应用当地调节和测试和测试工具(比如gdb)。

4.捌 、状态新闻

master使用嵌入式的HTTP服务器(如Jetty)彰显一组状态音信页面,用户可以监控种种实践景况。状态新闻页面呈现了席卷计算执行的快慢,比如曾经成功了有点任务、有个别许义务正在处理、输入的字节数、中间数据的字节数、输出的字节数、处理百分比等等。页面还含有了指向每一种职分的stderr和stdout文件的链接。用户依照这几个数量预测总括供给执行大概多久、是不是须要追加额外的一个钱打二15个结财富。那么些页面也能够用来分析哪些时候计算执行的比预想的要慢。

 

其它,处于最顶层的状态页面突显了如何worker失效了,以及她们失效的时候正在运作的Map和Reduce任务。那些新闻对于调节和测试用户代码中的bug很有帮带。

4.9、计数器

MapReduce库使用计数器总括不相同事件发生次数。比如,用户大概想计算已经处理了略微个单词、已经索引的有个别篇德文文书档案等等。

 

为了利用这些性格,用户在先后中创制三个命名的计数器对象,在Map和Reduce函数中相应的扩张计数器的值。例如:
Counter* uppercase;
uppercase = GetCounter(“uppercase”);

map(String name, String contents):
 for each word w in contents:
  if (IsCapitalized(w)):
   uppercase->Increment();
  EmitIntermediate(w, “1″);

那些计数器的值周期性的从种种单独的worker机器上传递给master(附加在ping的答疑包中传递)。master把实施成功的Map和Reduce任务的计数器值进行累计,当MapReduce操作完毕现在,重回给用户代码。

 

计数器当前的值也会显得在master的景色页面上,那样用户就能够见见近来估测计算的速度。当累加计数器的值的时候,master要检查重复运转的Map或者Reduce义务,幸免重新累加(在此以前提到的备用职务和失效后再也履行义务那三种情形会造成相同的任务被反复履行)。

 

有个别计数器的值是由MapReduce库自动维持的,比如曾经处理的输入的key/value
pair的多少、输出的key/value pair的多少等等。

 

计数器机制对于MapReduce操作的完整性检查十一分管用。比如,在一些MapReduce操作中,用户要求保障输出的key
value pair精确的对等输入的key value
pair,或许处理的德文文书档案数量在处理的总体文书档案数量中属于合理限定。

5、性能

本节大家用在两个巨型集群上运转的五个总括来衡量MapReduce的质量。一个划算在大体1TB的数据中展开一定的情势匹配,另一个盘算对大约1TB的数目开始展览排序。

 

那五个程序在多量的选拔MapReduce的实际上选择中是不行卓绝的 —
一类是对数码格式实行转移,从一种表现格局转换为其余一种表现格局;另一类是从海量数据中抽取少一些的用户感兴趣的多少。

5.① 、集群配置

持有那一个程序都运作在二个大致由1800台机械构成的集群上。每台机器配置1个2G主频、扶助超线程的IntelXeon处理器,4GB的物理内部存款和储蓄器,三个160GB的IDE硬盘和二个千兆以太网卡。这么些机器配置在五个两层的树形调换网络中,在root节点大概有100-200GBPS的传导带宽。全部那个机器都采用同一的安插(对等安插),因而任意两点时期的互联网来回时间低于1纳秒。

 

在4GB内部存储器里,大致有1-1.5G用来运维在集群上的其他职务。测试程序在周一午后开始履行,那时主机的CPU、磁盘和网络基本上处于空闲状态。

5.2、GREP

这么些分布式的grep程序须求扫描大概10的十次方个由玖十七个字节组成的记录,查找出现概率较小的三个字符的形式(这几个方式在9233八个记录中冒出)。输入数据被拆分成大概64M的Block(M=15000),整个输出数据存放在2个文件中(昂科拉=1)。必发bifa88手机客服端 2

图2呈现了这些运算随时间的处理进度。在这之中Y轴表示输入数据的处理速度。处理速度随着出席MapReduce总结的机械数量的加码而扩张,当1764台worker插香港足球总会括的时,处理速度达到了30GB/s。当Map职分完结的时候,即在计算先河后80秒,输入的处理速度降到0。整个计算进度从起先到停止一共花了大约150秒。那包涵了大体上一秒钟的起先运转阶段。开头运营阶段消耗的小时包罗了是把这些程序传送到各类worker机器上的时刻、等待GFS文件系统打开一千个输入文件集合的时日、获取相关的文件本地地点优化新闻的日子。

5.3、排序

排序程序处理10的10遍方个9伍个字节组成的记录(差不多1TB的数额)。那个顺序模仿TeraSort
benchmark[10]。

 

排序程序由不到50行代码组成。只有三行的Map函数从文本行中分析出十一个字节的key值作为排序的key,并且把那个key和原始文本行作为中间的key/value
pair值输出。我们利用了一个放到的恒等函数作为Reduce操作函数。那几个函数把高级中学级的key/value
pair值不作任何改变输出。最后排序结果输出到两路复制的GFS文件系统(也正是说,程序输出2TB的数额)。

 

如前所述,输入数据被分成64MB的Block(M=1陆仟)。大家把排序后的输出结果分区后存款和储蓄到5000个公文(ENVISION=5000)。分区函数使用key的原始字节来把数量分区到卡宴个部分中。

 

在那一个benchmark测试中,我们运用的分区函数知道key的分区意况。常常对于排序程序来说,大家会大增多个预处理的MapReduce操效用于采集样品key值的遍布处境,通过采集样品的数目来计量对终极排序处理的分区点。

必发bifa88手机客服端 3

图三(a)展现了这么些排序程序的不奇怪化实施进度。左上的图呈现了输入数据读取的速度。数据读取速度峰值会完结13GB/s,并且拥有Map职务到位今后,即差不离200秒以往极快滑落到0。值得注意的是,排序程序输入数据读取速度低于分布式grep程序。那是因为排序程序的Map职务花了大体上1/2的处理时间和I/O带宽把高级中学级输出结果写到本地硬盘。相应的分布式grep程序的中游结果输出大概能够忽略不计。

 

右侧中间的图展现了中等数据从Map职务发送到Reduce任务的网络速度。那几个进度从第10个Map任务到位之后就从头减缓起步了。图示的首先个山头是开发银行了第②批大致1700个Reduce职务(整个MapReduce分布到大致1700台机器上,每台机械一次最多执行3个Reduce任务)。排序程序运维大约300秒后,第二批启动的Reduce义务有点达成了,大家初步进行剩下的Reduce职责。全部的处理在大体600秒后甘休。

 

左下图表示Reduce任务把排序后的多少写到最后的出口文件的速度。在首先个排序阶段停止和数码开首写入磁盘之间有1个小的延时,那是因为worker机器正在忙于排序中间数据。磁盘写入速度在2-4GB/s持续一段时间。输出数据写入磁盘大致持续850秒。计入发轫运行部分的时日,整个运算消耗了891秒。那个速度和TeraSort
benchmark[18]的参天记录1057秒相大概。

 

还有一些值得注意的现象:输入数据的读取速度比排序速度和输出数据写入磁盘速度要高不少,那是因为大家的输入数据本地化优化策略起了效果

绝超过半数多少都是从本地硬盘读取的,从而省去了网络带宽。排序速度比出口数据写入到磁盘的速度快,那是因为出口数据写了两份(大家利用了2路的GFS文件系统,写入复制节点的原故是为了保险数据可信性和可用性)。大家把出口数据写入到八个复制节点的原由是因为那是底层文件系统的保证数据可相信性和可用性的达成机制。假使底层文件系统使用类似容错编码[14](erasure
coding)的法子而不是复制的法子保证数据的可信性和可用性,那么在输出数据写入磁盘的时候,就足以下落互连网带宽的运用。

5.4、高效的backup任务

图三(b)呈现了关门了备用职分后排序程序执行情状。执行的长河和图3(a)很相似,除了输出数据写磁盘的动作在时间上拖了三个不长的漏洞,而且在那段时日里,大概从不什么写入动作。在960秒后,唯有四个Reduce职责未能如愿。这么些拖后腿的职分又实行了300秒才马到成功。整个计算消耗了1283秒,多了1/2的实施时间。

5.伍 、失效的机器

在图三(c)中示范的排序程序执行的经过中,大家在先后起首后几分钟有意的kill了1746个worker中的200个。集群底层的调度及时在那一个机器上再次初叶新的worker处理进程(因为只是worker机器上的处理进度被kill了,机器本身还在劳作)。

 

图三(c)突显出了叁个“负”的输入数据读取速度,那是因为一些早已形成的Map职责丢失了(由于相应的施行Map任务的worker进程被kill了),供给再度履行这个任务。相关Map职责一点也不慢就被再一次履行了。整个运算在933秒内到位,蕴含了初阶运行时间(只比正规执行多消耗了5%的岁月)。

6、经验

小编们在二〇〇一年一月到位了第②个本子的MapReduce库,在二〇〇四年5月的版本有了显着的增加,那包蕴了输入数据本地优化、worker机器之间的动态负载均衡等等。从那现在,大家惊喜的意识,MapReduce库能广泛应用于大家经常工作中相见的各项难题。它今后在谷歌(Google)内部各种领域拿到广泛应用,包含:

  • 广泛机器学习难题
  • 谷歌(Google) News和Froogle产品的集群难题
  • 从万众询问产品(比如谷歌(Google)的Zeitgeist)的告诉中抽取数据。
  • 从大气的新应用和新产品的网页中提取有用信息(比如,从大气的地点搜索网页中抽取地理地方新闻)。
  • 科普的图样总结。

必发bifa88手机客服端 4

图四显得了在大家的源代码管理种类中,随着时间推移,独立的MapReduce程序数量的显着扩展。从贰零零叁年早些时候的0个增加到2002年六月份的大半900个例外的程序。MapReduce的成功取决于采纳MapReduce库能够在不到半个钟头时间内写出三个简短的先后,这个大概的主次能够在上千台机器的组成的集群上做科学普及出现处理,那庞大的加速了支出和本质设计的周期。此外,采取MapReduce库,能够让完全没有分布式和/或相互系统开发经历的程序员很简单的运用多量的财富,开发出分布式和/或并行处理的行使。

必发bifa88手机客服端 5

在各类职责完结的时候,MapReduce库计算测算财富的运用情状。在表1,大家列出了二零零三年10月份MapReduce运行的职分所占有的相关财富。

6.一 、大规模索引

到方今截至,MapReduce最成功的选拔便是重写了谷歌(Google)互连网搜索服务所使用到的index系统。索引系统的输入数据是互连网爬虫抓取回来的雅量的文档,那个文书档案数据都封存在GFS文件系统里。这几个文书档案原始内容(alex注:raw
contents,作者觉着正是网页中的剔除html标记后的剧情、pdf和word等有格式文书档案中领到的文件内容等)
的大小抢先了20TB。索引程序是透过一名目繁多的MapReduce操作(差不离5到拾遍)来建立目录。使用MapReduce(替换上2个专程陈设的、分布式处理的目录程序)带来那些好处:

  • 兑现索引部分的代码简单、小巧、不难明白,因为对于容错、分布式以及并行总计的处理都以MapReduce库提供的。比如,使用MapReduce库,计算的代码行数从原先的3800行C++代码缩短到大体700行代码。
  • MapReduce库的属性已经足足好了,因而大家能够把在概念上不相干的盘算步骤分开处理,而不是混在联合以期收缩多少传递的额外消耗。概念上不相干的计量步骤的隔断也使得大家得以很不难改变索引处理格局。比如,对从前的目录系统的二个小改变也许要消耗好多少个月的光阴,但是在运用MapReduce的新系统上,那样的转移只需求花几天时间就能够了。
  • 目录系统的操作管理更便于了。因为由机器失效、机器处理速度缓慢、以及网络的一弹指间不通等引起的多边难点都已经由MapReduce库化解了,不再须求操作人士的参加了。另外,大家能够透过在目录系统集群中加进机械的回顾方法升高全部处理质量。

柒 、相关工作

洋洋系统都提供了残酷的编制程序格局,并且经过对编制程序的严刻限制来落到实处并行总计。例如,3个重组函数能够由此把N个成分的数组的前缀在N个处理器上应用并行前缀算法,在log
N的时刻内总计完[6,9,13](alex注:完全没有明了作者在说吗,具体参考相关⑥ 、玖 、13文书档案)。MapReduce能够看作是大家构成在实际环境下处理海量数据的阅历,对这几个经典模型举办简化和萃取的成果。特别值得骄傲的是,我们还得以实现了基于上千台微型总结机的集群的容错处理。比较而言,半数以上面世处理种类都只在小框框的集群上落实,并且把容错处理交给了程序员。

 

Bulk Synchronous
Programming[17]和一些MPI原语[11]提供了更高级别的并行处理抽象,能够更便于写出并行处理的先后。MapReduce和这么些系统的首要差异之处在于,MapReduce利用限制性编制程序格局实现了用户程序的全自动并发处理,并且提供了晶莹剔透的容错处理。

 

咱俩多少本地优化策略的灵感来源于active disks[12,15]等技巧,在active
disks中,计算职分是尽可能推送到数量存款和储蓄的节点处理(alex注:即靠近数据源处理),诸如此类就裁减了网络和IO子系统的吞吐量。大家在挂载多少个硬盘的数见不鲜机器上实行大家的运算,而不是在磁盘处理器上推行大家的做事,可是达到的指标一样的。

 

大家的备用职务机制和CharlotteSystem[3]建议的eager调度机制比较相近。Eager调度机制的五个缺陷是一旦1个职务反复失效,那么万事计算就不可能形成。我们通过忽略引起故障的记录的章程在某种程度上化解了这一个题目。

 

MapReduce的落实依靠于一个里边的集群众管理理种类,那一个集群管理系列负责在2个超大的、共享机器的集群上分布和平运动作用户义务。就算这一个不是本散文的根本,但是有供给提一下,那个集群众管理理体系在意见上和别的系统,如Condor[16]是一样。

 

MapReduce库的排序机制和NOW-Sort[1]的操作上很接近。读取输入源的机械(map
workers)把待排序的数目实行分区后,发送到昂科拉个Reduce
worker中的三个进行处理。各样Reduce
worker在当地对数码进行排序(尽恐怕在内部存储器中排序)。当然,NOW-Sort没有给用户自定义的Map和Reduce函数的空子,因而不拥有MapReduce库广泛的实用性。

 

River[2]提供了二个编制程序模型:处理进程经过分布式队列传送数据的办法展开互动通信。和MapReduce类似,River系统尝试在狼狈等的硬件条件下,只怕在系统颠簸的意况下也能提供类似平均的性质。River是经过细致调度硬盘和网络的简报来抵消职分的做到时间。MapReduce库接纳了任何的艺术。通过对编制程序模型实行限制,MapReduce框架把标题解释变成大气的“小”职务。那么些任务在可用的worker集群上动态的调度,那样飞快的worker就足以实施更加多的职责。通过对编制程序模型举行限定,大家可用在劳作看似形成的时候调度备用职务,裁减在硬件配置不均衡的气象下减弱整个操作完成的年华(比如部分机器品质差、只怕机器被有个别操作阻塞了)。

 

BAD-FS[5]选用了和MapReduce完全两样的编制程序形式,它是面向广域网(alex注:wide-area
network)
的。可是,那七个体系有七个基础作用很相近。(1)四个系统运用重复履行的方式来防患出于失效导致的数量丢失。(2)多个都使用数据本地化调度策略,减弱互连网通信的数据量。

 

TACC[7]是三个用于简化构造高可用性互连网服务的系统。和MapReduce一样,它也借助重新履行机制来达成的容错处理。

8、结束语

MapReduce编制程序模型在Google内部成功应用于三个世界。大家把那种成功归咎为几个方面:首先,由于MapReduce封装了并行处理、容错处理、数据本地化优化、负载均衡等等技术难关的底细,这使得MapReduce库易于使用。即使对于截然没有相互大概分布式系统开发经历的程序员而言;其次,多量不等品种的难题都足以透过MapReduce简单的消除。比如,MapReduce用于生成谷歌(Google)的网络寻找服务所要求的数量、用来排序、用来多少挖掘、用于机器学习,以及广大别样的系统;第1,大家贯彻了2个在数千台电脑组成的特大型集群上灵活配置运维的MapReduce。那一个达成使得有效运用这个丰富的持筹握算财富变得十分简单,由此也合乎用来化解谷歌(Google)蒙受的任何很多内需大批量测算的题材。

 

咱俩也从MapReduce开发进度中学到了很多东西。首先,约束编制程序方式使得互相和分布式总括万分不难,也便于构造容错的估算环境;其次,网络带宽是稀缺财富。大量的系统优化是针对收缩网络传输量为指标的:本地优化策略使多量的多寡从当地球磁性盘读取,中间文件写入当地球磁性盘、并且只写一份中间文件也节省了互连网带宽;第②,多次执行同一的天职能够减弱性能缓慢的机械带来的负面影响(alex注:即硬件配置的不平衡),还要缓解了是因为机械失效导致的多寡丢失难题。

9、感谢

(alex注:还是原汁原味的感激词相比好,这一个就不翻译了)Josh Levenberg
has been instrumental in revising and extending the user-level MapReduce
API with a number of new features based on his experience with using
MapReduce and other people’s suggestions for enhancements. MapReduce
reads its input from and writes its output to the Google File System
[8]. We would like to thank Mohit Aron, Howard Gobioff, Markus
Gutschke, David Kramer, Shun-Tak Leung, and Josh Redstone for their work
in developing GFS. We would also like to thank Percy Liang and Olcan
Sercinoglu for their work in developing the cluster management system
used by MapReduce. Mike Burrows, Wilson Hsieh, Josh Levenberg, Sharon
Perl, Rob Pike, and Debby Wallach provided helpful comments on earlier
drafts of this paper.The anonymous OSDI reviewers, and our shepherd,
Eric Brewer, provided many useful suggestions of areas where the paper
could be improved. Finally, we thank all the users of MapReduce within
Google’s engineering organization for providing helpful feedback,
suggestions, and bug reports.

十 、参考资料

[1] Andrea C. Arpaci-Dusseau, Remzi H. Arpaci-Dusseau,David E. Culler,
Joseph M. Hellerstein, and David A. Patterson.High-performance sorting
on networks of workstations.In Proceedings of the 1997 ACM SIGMOD
InternationalConference on Management of Data, Tucson,Arizona, May

  1. [2] Remzi H. Arpaci-Dusseau, Eric Anderson, NoahTreuhaft, David E.
    Culler, Joseph M. Hellerstein, David Patterson, and Kathy Yelick.
    Cluster I/O with River:Making the fast case common. In Proceedings of
    the Sixth Workshop on Input/Output in Parallel and Distributed Systems
    (IOPADS ’99), pages 10.22, Atlanta, Georgia, May 1999.
    [3] Arash Baratloo, Mehmet Karaul, Zvi Kedem, and Peter Wyckoff.
    Charlotte: Metacomputing on the web. In Proceedings of the 9th
    International Conference on Parallel and Distributed Computing Systems,
  2. [4] Luiz A. Barroso, Jeffrey Dean, and Urs H¨olzle. Web search
    for a planet: The Google cluster architecture. IEEE Micro, 23(2):22.28,
    April 2003.
    [5] John Bent, Douglas Thain, Andrea C.Arpaci-Dusseau, Remzi H.
    Arpaci-Dusseau, and Miron Livny. Explicit control in a batch-aware
    distributed file system. In Proceedings of the 1st USENIX Symposium on
    Networked Systems Design and Implementation NSDI, March 2004.
    [6] Guy E. Blelloch. Scans as primitive parallel operations.IEEE
    Transactions on Computers, C-38(11), November 1989.
    [7] Armando Fox, Steven D. Gribble, Yatin Chawathe, Eric A. Brewer,
    and Paul Gauthier. Cluster-based scalable network services. In
    Proceedings of the 16th ACM Symposium on Operating System Principles,
    pages 78. 91, Saint-Malo, France, 1997.
    [8] Sanjay Ghemawat, Howard Gobioff, and Shun-Tak Leung. The Google
    file system. In 19th Symposium on Operating Systems Principles, pages
    29.43, Lake George, New York, 2003. To appear in OSDI 2004 12
    [9] S. Gorlatch. Systematic efficient parallelization of scan and
    other list homomorphisms. In L. Bouge, P. Fraigniaud, A. Mignotte, and
    Y. Robert, editors, Euro-Par’96. Parallel Processing, Lecture Notes in
    Computer Science 1124, pages 401.408. Springer-Verlag, 1996.
    [10] Jim Gray. Sort benchmark home
    page. http://research.microsoft.com/barc/SortBenchmark/.
    [11] William Gropp, Ewing Lusk, and Anthony Skjellum. Using MPI:
    Portable Parallel Programming with the Message-Passing Interface. MIT
    Press, Cambridge, MA, 1999.
    [12] L. Huston, R. Sukthankar, R.Wickremesinghe, M. Satyanarayanan, G.
    R. Ganger, E. Riedel, and A. Ailamaki. Diamond: A storage architecture
    for early discard in interactive search. In Proceedings of the 2004
    USENIX File and Storage Technologies FAST Conference, April 2004.
    [13] Richard E. Ladner and Michael J. Fischer. Parallel prefix
    computation. Journal of the ACM, 27(4):831.838, 1980.
    [14] Michael O. Rabin. Efficient dispersal of information for
    security, load balancing and fault tolerance. Journal of the ACM,
    36(2):335.348, 1989.
    [15] Erik Riedel, Christos Faloutsos, Garth A. Gibson, and David
    Nagle. Active disks for large-scale data processing. IEEE Computer,
    pages 68.74, June 2001.
    [16] Douglas Thain, Todd Tannenbaum, and Miron Livny. Distributed
    computing in practice: The Condor experience. Concurrency and
    Computation: Practice and Experience, 2004.
    [17] L. G. Valiant. A bridging model for parallel computation.
    Communications of the ACM, 33(8):103.111, 1997.
    [18] Jim Wyllie. Spsort: How to sort a terabyte
    quickly. http://alme1.almaden.ibm.com/cs/spsort.pdf.

 

附录A、单词频率总括

本节包罗了三个完整的次序,用于总括在一组命令行钦赐的输入文件中,每3个不比的单词出现频率。
#include “mapreduce/mapreduce.h”

// User’s map function
class WordCounter : public Mapper {
 public:
  virtual void Map(const MapInput& input) {
   const string& text = input.value();
   const int n = text.size();
   for (int i = 0; i < n; ) {
    // Skip past leading whitespace
    while ((i < n) && isspace(text[i]))
     i++;

   // Find word end
   int start = i;
   while ((i < n) && !isspace(text[i]))
    i++;
   if (start < i)
    Emit(text.substr(start,i-start),”1″);
  }
 }
};

REGISTER_MAPPER(WordCounter);

// User’s reduce function
class Adder : public Reducer {
 virtual void Reduce(ReduceInput* input) {
  // Iterate over all entries with the
  // same key and add the values
  int64 value = 0;
  while (!input->done()) {
   value += StringToInt(input->value());
   input->NextValue();
  }

  // Emit sum for input->key()
  Emit(IntToString(value));
 }
};

REGISTER_REDUCER(Adder);

int main(int argc, char** argv) {
 ParseCommandLineFlags(argc, argv);
 
 MapReduceSpecification spec;
 
 // Store list of input files into “spec”
 for (int i = 1; i < argc; i++) {
  MapReduceInput* input = spec.add_input();
  input->set_format(“text”);
  input->set_filepattern(argv[i]);
  input->set_mapper_class(“WordCounter”);
 }

 // Specify the output files:
 // /gfs/test/freq-00000-of-00100
 // /gfs/test/freq-00001-of-00100
 // …
 MapReduceOutput* out = spec.output();
 out->set_filebase(“/gfs/test/freq”);
 out->set_num_tasks(100);
 out->set_format(“text”);
 out->set_reducer_class(“Adder”);
 
 // Optional: do partial sums within map
 // tasks to save network bandwidth
 out->set_combiner_class(“Adder”);

 // Tuning parameters: use at most 2000
 // machines and 100 MB of memory per task
 spec.set_machines(2000);
 spec.set_map_megabytes(100);
 spec.set_reduce_megabytes(100);
 
 // Now run it
 MapReduceResult result;
 if (!MapReduce(spec, &result)) abort();
 
 // Done: ‘result’ structure contains info
 // about counters, time taken, number of
 // machines used, etc.
 return 0;
}

相关文章