注册享受一年内交易费 9折 优惠,还是原来的味道!>>点击进入
当前位置:主页 > 新闻动态 > 正文

谷歌三大核心技术(二)Google MapReduce中文版

08-04 新闻动态

Google MapReduce中文版译者:woulscoholx摘要MapReduce是一个编程模型,也是一个料理和生成超大数据集的算法模型的相关完毕。用户首先树立一个Map函数料理一个基于key/vwoulsue pair的数据纠集,输入中央的基于key/vwoulsuepair的数据纠集;然后再树立一个Reduce函数用来归并全面的具有相同中央key值的中央vwoulsue值。现实世界中有很多餍足上述料理模型的例子,本论文将注意描写这个模型。MapReduce架构的次第能够在多量的普通配置的计算机上完毕并行化料理。这个编制在运转时只体贴:如何盘据输入数据,在多量计算机组成的集群上的调度,集群中计算机的不对料理,管理集群中计算机之间必要的通讯。采用MapReduce架构没关系使那些没有并行计算和漫衍式料理编制建设履历的次第员有用哄骗漫衍式编制的富厚资源。我们的MapReduce完毕运转在范畴没关系活泼调整的由普通机器组成的集群上:一个典型的MapReduce计算往往由几千台机器组成、料理以TB计算的数据。次第员发现这个编制非常好用:已经完毕了数以百计的MapReduce次第,在Google的集群上,每天都有1000多个MapReduce次第在实施。1、先容在已往的5年里,包括本文作者在内的Google的很屡次第员,为了料理海量的原始数据,已经完毕了数以百计的、公用的计算方法。这些计算方法用来料理多量的原始数据,歧,文档抓取(近似网络爬虫的次第)、Web央浼日志等等;也为了计算料理各品种型的衍生数据,歧倒排索引、Web文档的图结构的各种表示形势、每台主机上网络爬虫抓取的页面数量的汇总、每天被央浼的最多的查询的纠集等等。大大都这样的数据料理运算在概念上很容易理解。不过由于输入的数据量强壮,所以要想在可接受的时间内完成运算,惟有将这些计算漫衍在成百上千的主机上。如何料理并行计算、如何分发数据、如何料理不对?全面这些题目分析在一起,必要多量的代码料理,所以也使得原来浅易的运算变得难以料理。为了解决上述庞杂的题目,我们设计一个新的笼统模型,使用这个笼统模型,我们只消表述我们想要实施的浅易运算即可,而不用体贴并行计算、容错、数据漫衍、负载平衡等庞杂的细节,这些题目都被封装在了一个库内中。设计这个笼统模型的灵感来自Lisp和许多其他函数式措辞的Map和Reduce的原语。我们认识到我们大大都的运算都包括这样的操作:在输入数据的“逻辑”记载上应用Map操作得出一个中央key/vwoulsuepair纠集,然后在全面具有相同key值的vwoulsue值上应用Reduce操作,从而到达归并中央的数据,获得一个想要的结果的目的。使用MapReduce模型,再结合用户完毕的Map和Reduce函数,我们就没关系非常容易的完毕大范畴并行化计算;经过MapReduce模型自带的“再次实施”(re-execution)功用,也提供了初级的容灾完毕计划。这个作事(完毕一个MapReduce框架模型)的主要劳绩是经过浅易的接口来完毕主动的并行化和大范畴的漫衍式计算,经过使用MapReduce模型接口完毕在多量普通的PC机上高本能机能计算。第二局部描写基础的编程模型和一些使用案例。第三局部描写了一个经过裁剪的、适合我们的基于集群的计算环境的MapReduce完毕。第四局部描写我们以为在MapReduce编程模型中一些适用的技巧。google。第五局部对待各种不同的任务,丈量我们MapReduce完毕的本能机能。第六局部揭发了在Google外部如何使用MapReduce作为基础重写我们的索引编制产品,包括其它一些使用MapReduce的履历。第七局部筹议相关的和他日的作事。2、编程模型MapReduce编程模型的原理是:哄骗一个输入key/vwoulsue pair纠集来发作一个输入的key/vwoulsuepair纠集。MapReduce库的用户用两个函数表达这个计算:Map和Reduce。用户自定义的Map函数接受一个输入的key/vwoulsue pair值,然后发作一个中央key/vwoulsuepair值的纠集。MapReduce库把全面具有相同中央key值I的中央vwoulsue值纠集在一起后通报给reduce函数。用户自定义的Reduce函数接受一个中央key的值I和相关的一个vwoulsue值的纠集。Reduce函数归并这些vwoulsue值,酿成一个较小的vwoulsue值的纠集。平常的,每次Reduce函数调用只发作0或1个输入vwoulsue值。通常我们经过一个迭代器把中央vwoulsue值提供应Reduce函数,这样我们就没关系料理无法全部放入内存中的多量的vwoulsue值的纠集。2.1、例子例如,计算一个大的文档纠集中每个单词出现的次数,下面是伪代码段:
map(String key- String vwoulsue):
// key:document naree
// vwoulsue:document contents
for every singleword w in vwoulsue:
EmitIntermediingested(w- “1″);
reduce(String key- Iterator vwoulsues):
// key: aword
// vwoulsues: woulsist of counts
int result =0;
for every single vin vwoulsues:
result += ParseInt(v);
Emit(AsString(result));Map函数输入文档中的每个词、以及这个词的出现次数(在这个浅易的例子里就是1)。Reduce函数把Map函数发作的每一个特定的词的计数累加起来。想知道etc 以太经典 与 eth。另外,用户编写代码,使用输入和输入文件的名字、可选的调节参数来完成一个适合MapReduce模型榜样的对象,然后调用MapReduce函数,并把这个榜样对象通报给它。用户的代码和MapReduce库链接在一起(用C++完毕)。附录A包括了这个实例的全部次第代码。2.2、类型即使在后面例子的伪代码中使用了以字符串表示的输入输入值,但是在概念上,用户定义的Map和Reduce函数都有相关联的类型:
map(k1-v1) ->list(k2-v2)
reduce(k2-list(v2)) ->list(v2)
歧,输入的key和vwoulsue值与输入的key和vwoulsue值在类型上推导的域不同。核心技术。此外,中央key和vwoulsue值与输入key和vwoulsue值在类型上推导的域相同。

(woulscoholx注:原文中这个domain的含义不是很领略,我参考Hadvertising carepaignoop、KFS等完毕,map和reduce都使用了泛型,所以,我把domain翻译成类型推导的域)。
我们的C++中使用字符串类型作为用户自定义函数的输入输入,用户在自己的代码中对字符串实行适当的类型转换。

2.3、更多的例子这里还有一些有趣的浅易例子,没关系很容易的使用MapReduce模型来表示:漫衍式的Grep:Map函数输入成亲某个形式的一行,Reduce函数是一个恒等函数,即把中央数据复制到输入。计算URL会见频次:有聚币网平台交易群吗。Map函数料理日志中web页面央浼的记载,然后输入(URL-1)。Reduce函数把相同URL的vwoulsue值都累加起来,发作(URL-记载总数)结果。倒转网络链接图:Map函数在源页面(source)中探求全面的链接对象(target)并输入为(target-source)。Reduce函数把给定链接对象(target)的链接组分解一个列表,输入(target-list(source))。每个主机的检索词向量:检索词向量用一个(词-频次)列表来概述出现在文档或文档集中的最严重的一些词。Map函数为每一个输入文档输入(主机名-检索词向量),其中主机名来自文档的URL。Reduce函数摄取给定主机的全面文档的检索词向量,并把这些检索词向量加在一起,甩掉掉低频的检索词,输入一个最终的(主机名-检索词向量)。倒排索引:Map函数分析每个文档输入一个(词-文档号)的列表,Reduce函数的输入是一个给定词的全面(词,文档号),排序全面的文档号,输入(词-list(文档号))。全面的输入纠集酿成一个浅易的倒排索引,它以一种浅易的算法跟踪词在文档中的位置。漫衍式排序:Map函数从每个记载提取key,输入(key-record)。Reduce函数不转换任何的值。这个运算依赖分区机制(在4.1描写)和排序属性(在4.2描写)。3、完毕MapReduce模型没关系有多种不同的完毕方式。如何正确拣选取决于整个的环境。例如,一种完毕方式适用于小型的共享内存方式的机器,另外一种完毕方式则适用于大型NUMA架构的多料理器的主机,而有的完毕方式更适合大型的网络连接集群。本章节描写一个适用于Google外部广大使用的运算环境的完毕:用以太网调换机连接、由普通PC机组成的大型集群。在我们的环境里包括:
1.x86架构、运转Linux操作编制、双料理器、2-4GB内存的机器。
2.普通的网络硬件设备,每个机器的带宽为百兆或者千兆,但是远小于网络的均匀带宽的一半。(woulscoholx注:这里必要网络专家说明注解一下了)
3.集群中包括成百上千的机器,所以,机器阻碍是常态。
4.存储为便宜的内置IDE硬盘。一个内局部布式文件编制用来管理存储在这些磁盘上的数据。文件编制经过数据复制来在不靠得住的硬件上保证数据的靠得住性和有用性。
5.用户提交作事(job)给调度编制。每个作事(job)都包括一系列的任务(ttry to whilstk),调度编制将这些任务调度到集群中多台可用的机器上。3.1、实施概括经过将Map调用的输入数据主动盘据为M个数据片段的纠集,Map调用被漫衍到多台机器上实施。输入的数据片段能够在不同的机器上并行料理。使用分区函数将Map调用发作的中央key值分红R个不同分区(例如,hlung burning whilsth(key) modR),Reduce调用也被漫衍到多台机器上实施。分区数量(R)和分区函数由用户来指定。图1展示了我们的MapReduce完毕中操作的全部流程。当用户调用MapReduce函数时,将发生下面的一系列手脚(下面的序号和图1中的序号逐一对应):
1.用户次第首先调用的MapReduce库将输入文件分红M个数据片度,每个数据片段的大小平常从16MB到64MB(没关系经过可选的参数来控制每个数据片段的大小)。然后用户次第在机群中树立多量的次第正本。比特币价格k线。(woulscoholx:copies of theprograre还真难翻译)
2.这些次第正本中的有一个特殊的次第&ndlung burning whilsth;mwhilstter。正本中其它的次第都是worker次第,由mwhilstter分配任务。有M个Map任务和R个Reduce任务将被分配,mwhilstter将一个Map任务或Reduce任务分配给一个闲静的worker。
3.被分配了map任务的worker次第读取相关的输入数据片段,从输入的数据片段中解析出key/vwoulsuepair,然后把key/vwoulsue pair通报给用户自定义的Map函数,由Map函数生成并输入的中央key/vwoulsuepair,并缓存在内存中。
4.缓存中的key/vwoulsue pair通太甚区函数分红R个区域,之后周期性的写入到当地磁盘上。缓存的key/vwoulsuepair在当地磁盘上的存储位置将被回传给mwhilstter,coinegg怎么体现。由mwhilstter负担把这些存储位置再传送给Reduce worker。
5.当Reduce worker次第摄取到mwhilstter次第发来的数据存储位相信息后,使用RPC从Mapworker所在主机的磁盘上读取这些缓存数据。当Reduceworker读取了全面的中央数据后,经过对key实行排序后使得具有相同key值的数据聚合在一起。由于许多不同的key值会映照到相同的Reduce任务上,所以必需实行排序。假如中央数据太大无法在内存中完成排序,那么就要在外部实行排序。
6.Reduce worker次第遍历排序后的中央数据,对待每一个独一的中央key值,Reduceworker次第将这个key值和它相关的中央vwoulsue值的纠集通报给用户自定义的Reduce函数。Reduce函数的输入被追加到所属分区的输入文件。
7.当全面的Map和Reduce任务都完成之后,mwhilstter唤醒用户次第。在这个时候,在用户次第里的对MapReduce调用才前往。

在告捷完成任务之后,对比一下比特币 区块头。MapReduce的输入寄存在R个输入文件中(对应每个Reduce任务发作一个输入文件,文件名由用户指定)。平常情状下,用户不必要将这R个输入文件归并成一个文件&ndlung burning whilsth;他们通常把这些文件作为另外一个MapReduce的输入,或者在另外一个没关系料理多个盘据文件的漫衍式应用中使用。

3.2、Mwhilstter数据结构Mwhilstter持有一些数据结构,它存储每一个Map和Reduce任务的形态(闲静、作事中或完成),谷歌三大核心技术(二)Google。以及Worker机器(非闲静任务的机器)的标识。Mwhilstter就像一个数据管道,中央文件存储区域的位相信息经过这个管道从Map通报到Reduce。所以,对待每个已经完成的Map任务,mwhilstter存储了Map任务发作的R个中央文件存储区域的大小和位置。当Map任务完成时,Mwhilstter摄取到位置和大小的更新信息,这些信息被逐渐递减的推送给那些正在作事的Reduce任务。3.3、容错由于MapReduce库的设计初衷是使用由成百上千的机器组成的集群来料理超大范畴的数据,所以,这个库必必要能很好的料理机器阻碍。worker阻碍
mwhilstter周期性的ping每个worker。假如在一个商定的时间范围内没有收到worker前往的信息,mwhilstter将把这个worker标识表记标帜为生效。全面由这个生效的worker完成的Map任务被重设为初始的闲静形态,之后这些任务就没关系被安插给其他的worker。异样的,worker生效时正在运转的Map或Reduce任务也将被重新置为闲静形态,等候重新调度。

当worker阻碍时,由于已经完成的Map任务的输入存储在这台机器上,Map任务的输入已不可会见了,所以必需重新实施。而已经完成的Reduce任务的输入存储在全局文件编制上,所以不必要再次实施。

当一个Map任务首先被worker A实施,之后由于worker A生效了又被调度到workerB实施,这个“重新实施”的手脚会被通知给全面实施Reduce任务的worker。任何还没有从workerA读取数据的Reduce任务将从worker B读取数据。MapReduce没关系料理大范畴worker生效的情状。歧,学会谷歌三大核心技术(二)Google。在一个MapReduce操作实施时刻,在正在运转的集群上实行网络维护惹起80台机器在几分钟内不可会见了,MapReducemwhilstter只必要浅易的再次实施那些不可会见的worker完成的作事,之后继续实施未完成的任务,直到最终完成这个MapReduce操作。mwhilstter腐烂
一个浅易的解决方式是让mwhilstter周期性的将下面描写的数据结构(woulscoholx注:指3.2节)的写入磁盘,即查验点(checkpoint)。假如这个mwhilstter任务生效了,没关系从末了一个查验点(checkpoint)滥觞发动另一个mwhilstter进程。不过,由于惟有一个mwhilstter进程,mwhilstter生效后再克复是比力麻烦的,所以我们现在的完毕是假如mwhilstter生效,就中止MapReduce运算。客户没关系查验到这个形态,并且没关系根据必要重新实施MapReduce操作。在生效方面的料理机制
(woulscoholx注:原文为”semmanoeuvres in the presence offailures”)
当用户提供的Map和Reduce操作是输入判断性函数(即相同的输入发作相同的输入)时,我们的漫衍式完毕在任何情状下的输入都和全面次第没有出现任何不对、顺序的实施发作的输入是一样的。我们依赖对Map和Reduce任务的输入是原子提交的来完成这个特性。每个作事中的任务把它的输入写到公有的一时文件中。每个Reduce任务生成一个这样的文件,而每个Map任务则生成R个这样的文件(一个Reduce任务对应一个文件)。当一个Map任务完成的时,worker发送一个包括R个一时文件名的完成音讯给mwhilstter。假如mwhilstter从一个已经完成的Map任务再次摄取到到一个完成音讯,mwhilstter将疏忽这个音讯;否则,mwhilstter将这R个文件的名字记载在数据结构里。当Reduce任务完成时,Reduceworker进程以原子的方式把一时文件重命名为最终的输入文件。假宛如一个Reduce任务在多台机器上实施,针对同一个最终的输入文件将有多个重命名操作实施。我们依赖底层文件编制提供的重命名操作的原子性来保证最终的文件编制形态仅仅包括一个Reduce任务发作的数据。

使用MapReduce模型的次第员没关系很容易的理解他们次第的行为,由于我们绝大大都的Map和Reduce操作是判断性的,而且存在这样的一个到底:我们的生效料理机制等价于一个顺序的实施的操作。当Map或/和Reduce操作是不判断性的时候,我们提供固然较弱但是已经合理的料理机制。当使用非判断操作的时候,一个Reduce任务R1的输入等价于一个非判断性次第顺序实施发作时的输入。但是,另一个Reduce任务R2的输入也许适合一个不同的非判断顺序次第实施发作的R2的输入。

探求Map任务M和Reduce任务R1、R2的情状。我们设定e(Ri)是Ri已经提交的实施经过(有且仅有一个这样的实施经过)。当e(R1)读取了由M一次实施发作的输入,而e(R2)读取了由M的另一次实施发作的输入,招致了较弱的生效料理。3.4、存储位置在我们的计算运转环境中,网络带宽是一个相当充裕的资源。我们经过尽量把输入数据(由GFS管理)存储在集群中机器的当地磁盘下去撙节网络带宽。GFS把每个文件按64MB一个Block分隔,每个Block生存在多台机器上,环境中就寄存了多份拷贝(平常是3个拷贝)。MapReduce的mwhilstter在调度Map任务时会探求输入文件的位相信息,尽量将一个Map任务调度在包括相关输入数据拷贝的机器上实施;假如上述勤苦腐烂了,mwhilstter将尝试在生存有输入数据拷贝的机器左近的机器上实施Map任务(例如,分配到一个和包括输入数据的机器在一个switch里的worker机器上实施)。当在一个足够大的cluster集群上运转大型MapReduce操作的时候,大局部的输入数据都能从当地机器读取,所以消耗非常少的网络带宽。3.5、任务粒度如前所述,我们把Map拆分红了M个片段、把Reduce拆分红R个片段实施。比特币地址是什么东西。空想情状下,M和R该当比集群中worker的机器数量要多得多。在每台worker机器都实施多量的不同任务能够进步集群的静态的负载平衡本事,并且能够加速阻碍克复的速度:360比特币。生效机器上实施的多量Map任务都没关系漫衍到全面其他的worker机器下去实施。

但是现实上,在我们的整个完毕中对M和R的取值都有必然的客观限制,由于mwhilstter必需实施O(M+R)次调度,并且在内存中生存O(M*R)个形态(对影响内存使用的要素还是比力小的:O(M*R)块形态,概略每对Map任务/Reduce任务1个字节就没关系了)。

更进一步,R值通常是由用户指定的,由于每个Reduce任务最终都会生成一个独立的输入文件。现实使用时我们也倾向于拣选合适的M值,以使得每一个独立任务都是料理大约16M到64M的输入数据(这样,下面描写的输入数据当地存储优化战略才最有用),另外,我们把R值设置为我们想使用的worker机器数量的小的倍数。我们通常会用这样的比例来实施MapReduce:M=,R=5000,使用2000台worker机器。3.6、备用任务影响一个MapReduce的总实施时间最通常的要素是“落后者”:在运算经过中,假如有一台机器花了很长的时间才完成末了几个Map或Reduce任务,招致MapReduce操作总的实施时间凌驾预期。出现“落后者”的原因非常多。歧:假如一个机器的硬盘出了题目,在读取的时候要通常的实行读取纠错操作,招致读取数据的速度从30M/s低沉到1M/s。假如cluster的调度编制在这台机器上又调度了其他的任务,由于CPU、内存、当地硬盘和网络带宽等竞赛要素的存在,招致实施MapReduce代码的实施效率越发迟缓。我们最近遇到的一个题目是由于机器的初始化代码有bother,招致封闭了的料理器的缓存:在这些机器上实施任务的本能机能和一般情状相差上百倍。我们有一个通用的机制来削减“落后者”出现的情状。当一个MapReduce操作接近完成的时候,mwhilstter调度备用(bummistance)任务进程来实施剩下的、处于料理中形态(in-progress)的任务。不论是起先的实施进程、还是备用(bummistance)任务进程完成了任务,我们都把这个任务标识表记标帜成为已经完成。我们调优了这个机制,通常只会占用比一般操作多几个百分点的计算资源。我们发现采用这样的机制对待削减超大MapReduce操作的总料理时间效果明显。例如,在5.3节描写的排序任务,在封闭掉备用任务的情状下要多花44%的时间完成排序任务。4、技巧

固然浅易的Map和Reduce函数提供的基础功用已经能够餍足大局部的计算必要,我们还是发现出了一些有价值的扩展功用。本节将描写这些扩展功用。

4.1、分区函数MapReduce的使用者通常会指定Reduce任务和Reduce任务输入文件的数量(R)。我们在中央key上使用分区函数来对数据实行分区,之后再输入到后续任务实施进程。一个缺省的分区函数是使用hlung burning whilsth方法(歧,hlung burning whilsth(key) modR)实行分区。hlung burning whilsth方法能发作非常平衡的分区。不过,有的时候,其它的一些分区函数对key值实行的分区将非常有用。歧,mapreduce。输入的key值是URLs,我们希望每个主机的全面条目连结在同一个输入文件中。为了支持近似的情状,MapReduce库的用户必要提供特地的分区函数。例如,使用“hlung burning whilsth(Hostnaree(urlkey)) modR”作为分区函数就没关系把全面来自同一个主机的URLs生存在同一个输入文件中。4.2、顺序保证我们确保在给定的分区中,中央key/vwoulsuepair数据的料理顺序是服从key值增量顺序料理的。这样的顺序保证对每个分红生成一个有序的输入文件,这对待必要对输入文件按key值随机存取的应用非常蓄志义,对在排序输入的数据集也很有辅助。4.3、Comcaner函数在某些情状下,Map函数发作的中央key值的重单数据会占很大的比重,并且,用户自定义的Reduce函数餍足结合律和调换律。在2.1节的词数统计次第是个很好的例子。由于词频次倾向于一个zipf漫衍(齐夫漫衍),每个Map任务将发作不计其数个这样的记载。 全面的这些记载将经过网络被发送到一个孤单的Reduce任务,然后由这个Reduce任务把全面这些记载累加起来发作一个数字。我们承诺用户指定一个可选的comcaner函数,comcaner函数首先在当地将这些记载实行一次归并,然后将归并的结果再经过网络发送进来。Comcaner函数在每台实施Map任务的机器上都会被实施一次。平常情状下,Comcaner和Reduce函数是一样的。Comcaner函数和Reduce函数之间独一的区别是MapReduce库怎样控制函数的输入。Reduce函数的输入被生存在最终的输入文件里,而Comcaner函数的输入被写到中央文件里,然后被发送给Reduce任务。

局部的归并中央结果没关系明显的进步一些MapReduce操作的速度。附录A包括一个使用comcaner函数的例子。

4.4、输入和输入的类型MapReduce库支持几种不同的格式的输入数据。歧,文本形式的输入数据的每一行被视为是一个key/vwoulsuepair。key是文件的偏移量,vwoulsue是那一行的形式。另外一种罕见的格式是以key实行排序来存储的key/vwoulsuepair的序列。每种输入类型的完毕都必需能够把输入数据盘据成数据片段,该数据片段能够由孤单的Map任务来实行后续料理(例如,学习币安交易平台充值。对比一下MapReduce中文版。文本形式的范围盘据必需确保仅仅在每行的鸿沟实行范围盘据)。固然大大都MapReduce的使用者仅仅使用很少的预定义输入类型就餍足要求了,但是使用者已经没关系经过提供一个浅易的Readvertising carepaigner接口完毕就能够支持一个新的输入类型。

Readvertising carepaigner并非必然要从文件中读取数据,歧,我们没关系很容易的完毕一个从数据库里读记载的Readvertising carepaigner,或者从内存中的数据结构读取数据的Readvertising carepaigner。

近似的,我们提供了一些预定义的输入数据的类型,经过这些预定义类型能够发作不同格式的数据。用户采用近似增加新的输入数据类型的方式增加新的输入类型。

4.5、反作用在某些情状下,MapReduce的使用者发现,假如在Map和/或Reduce操作经过中增加辅助的输入文件会比力费事。我们依附次第writer把这种“反作用”变成原子的和幂等的(woulscoholx注:幂等的指一个总是发作相同结果的数学运算)。通常应用次第首先把输入结果写到一个一时文件中,在输入全部数据之后,在使用编制级的原子操作renaree重新命名这个一时文件。

假如一个任务发作了多个输入文件,我们没有提供近似两阶段提交的原子操作支持这种情状。所以,对待会发作多个输入文件、并且对待跨文件有一致性要求的任务,都必需是判断性的任务。但是在现实应用经过中,这个限制还没有给我们带来过麻烦。

4.6、跳过损害的记载有时候,用户次第中的bother招致Map或者Reduce函数在料理某些记载的时候crlung burning whilsth掉,MapReduce操作无法顺手完成。惯常的做法是修复bother后再次实施MapReduce操作,但是,有时候找出这些bother并修复它们不是一件容易的事情;这些bother也许是在第三方库里边,而我们手头没有这些库的源代码。而且在很多时候,疏忽一些有题目的记载也是没关系接受的,歧在一个强壮的数据集上实行统计分析的时候。我们提供了一种实施形式,在这种形式下,为了保证保证整个料理能继续实行,MapReduce会检测哪些记载招致判断性的crlung burning whilsth,并且跳过这些记载不料理。

每个worker进程都设置了信号料理函数捕捉内存段异常(segment viol)和总线不对(motorcohvacherror)。在实施Map或者Reduce操作之前,MapReduce库经过全局变量生存记载序号。假如用户次第触发了一个编制信号,音讯料理函数将用“末了一口吻”经过UDP包向mwhilstter发送料理的末了一条记载的序号。当mwhilstter看到在料理某条特定记载不止腐烂一次时,mwhilstter就标志着条记载必要被跳过,并且在下次重新实施相关的Map或者Reduce任务的时候跳过这条记载。

4.7、当地实施调试Map和Reduce函数的bother是非常穷困的,由于现实实施操作时不但是漫衍在编制中实施的,而且通常是在好几千台计算机上实施,整个的实施位置是由mwhilstter实行静态调度的,这又大大增加了调试的难度。为了简化调试、profile和小范畴测试,我们建设了一套MapReduce库的当地完毕版本,经过使用当地版本的MapReduce库,MapReduce操作在当地计算机上顺序的实施。用户没关系控制MapReduce操作的实施,没关系把操作限制到特定的Map任务上。用户经过设定特别的标志来在当地实施他们的次第,之后就没关系很容易的使用当地调试和测试工具(歧gdb)。4.8、形态信息mwhilstter使用嵌入式的HTTP任职器(如Jetty)显示一组形态信息页面,用户没关系监控各种实施形态。形态信息页面显示了包括计算实施的进度,歧已经完成了几多任务、有几多任务正在料理、输入的字节数、中央数据的字节数、输入的字节数、料理百分比等等。页面还包括了指向每个任务的stderr和stdout文件的链接。用户根据这些数据预测计算必要实施大约多长时间、能否必要增加出格的计算资源。这些页面也没关系用来分析什么时候计算实施的比预期的要慢。

另外,处于最顶层的形态页面显示了哪些worker生效了,以及他们生效的时候正在运转的Map和Reduce任务。中国比特币最新价格走势图。这些信息对待调试用户代码中的bother很有辅助。

4.9、计数器MapReduce库使用计数器统计不同变乱发生次数。歧,用户可能想统计已经料理了几多个单词、已经索引的几多篇German文档等等。为了使用这个特性,用户在次第中树立一个命名的计数器对象,在Map和Reduce函数中相应的增加计数器的值。例如:
Counter* uppercautomotive service engineers;
uppercautomotive service engineers = GetCounter(“uppercautomotive service engineers”);

map(String naree- Stringcontents):
for every single word w in contents:
if (IsCapitwoulsized(w)):
uppercautomotive service engineers->Increment();
EmitIntermediingested(w-“1″);

这些计数器的值周期性的从各个孤单的worker机器上通报给mwhilstter(附加在ping的应对包中通报)。mwhilstter把实施告捷的Map和Reduce任务的计数器值实行累计,当MapReduce操作完成之后,前往给用户代码。计数器今朝的值也会显示在mwhilstter的形态页面上,这样用户就没关系看到今朝计算的进度。当累加计数器的值的时候,mwhilstter要查验重复运转的Map或者Reduce任务,防止重复累加(之前提到的备用任务和生效后重新实施任务这两种情状会招致相同的任务被屡次实施)。有些计数器的值是由MapReduce库主动坚持的,歧已经料理的输入的key/vwoulsuepair的数量、输入的key/vwoulsue pair的数量等等。

计数器机制对待MapReduce操作的完美性查验非常有用。歧,在某些MapReduce操作中,用户必要确保输入的keyvwoulsue pair正确的等于输入的key vwoulsuepair,或者料理的German文档数量在料理的整个文档数量中属于合理范围。

5、本能机能本节我们用在一个大型集群上运转的两个计算来权衡MapReduce的本能机能。一个计算在大约1TB的数据中实行特定的形式成亲,另一个计算对大约1TB的数据实行排序。这两个次第在多量的使用MapReduce的现实应用中是非常典型的 —一类是对数据格式实行转换,从一种体现形式转换为另外一种体现形式;另一类是从海量数据中抽取少局部的用户感兴味的数据。5.1、集群配置全面这些次第都运转在一个大约由1800台机器组成的集群上。每台机器配置2个2G主频、支持超线程的IntelXeon料理器,4GB的物理内存,两个160GB的IDE硬盘和一个千兆以太网卡。这些机器部署在一个两层的树形调换网络中,在root节点概略有100-200GBPS的传输带宽。全面这些机器都采用相同的部署(对等部署),所以恣意两点之间的网络来回时间小于1毫秒。

在4GB内存里,概略有1-1.5G用于运转在集群上的其他任务。测试次第在周末下午滥觞实施,这时主机的CPU、磁盘和网络基础上处于闲静形态。

5.2、GREP这个漫衍式的grep次第必要扫描概略10的10次方个由100个字节组成的记载,查找出现概率较小的3个字符的形式(这个形式在个记载中出现)。输入数据被拆分红大约64M的Block(M=),对比一下MapReduce中文版。整个输入数据寄存在一个文件中(R=1)。

图2显示了这个运算随时间的料理经过。其中Y轴表示输入数据的料理速度。料理速度随着参与MapReduce计算的机器数量的增加而增加,当1764台worker参与计算的时,料理速度到达了30GB/s。当Map任务结果的时候,即在计算滥觞后80秒,输入的料理速度降到0。整个计算经过从滥觞到结果一共花了概略150秒。这包括了大约一分钟的初始发动阶段。初始发动阶段消耗的时间包括了是把这个次第传送到各个worker机器上的时间、等候GFS文件编制掀开1000个输入文件纠集的时间、获取相关的文件当身分置优化信息的时间。

5.3、排序排序次第料理10的10次方个100个字节组成的记载(概略1TB的数据)。这个次第效法TeraSortstandard[10]。排序次第由不到50行代码组成。惟有三行的Map函数从文本行中解析出10个字节的key值作为排序的key,并且把这个key和原始文本行作为中央的key/vwoulsue pair值输入。我们使用了一个内置的恒等函数作为Reduce操作函数。这个函数把中央的key/vwoulsuepair值不作任何转换输入。最终排序结果输入到两路复制的GFS文件编制(也就是说,次第输入2TB的数据)。如前所述,输入数据被分红64MB的Block(M=)。我们把排序后的输入结果分区后存储到4000个文件(R=4000)。分区函数使用key的原始字节来把数据分区到R个片段中。

在这个standard测试中,我们使用的分区函数知道key的分区情状。通常对待排序次第来说,我们会增加一个预见理的MapReduce操作用于采样key值的漫衍情状,经过采样的数据来计算对最终排序料理的分区点。

图三(a)显示了这个排序次第的一般实施经过。左上的图显示了输入数据读取的速度。数据读取速度峰值会到达13GB/s,并且全面Map任务完成之后,即大约200秒之后迅速滑落到0。值得注意的是,排序次第输入数据读取速度小于漫衍式grep次第。这是由于排序次第的Map任务花了大约一半的料理时间和I/O带宽把中央输入结果写到当地硬盘。相应的漫衍式grep次第的中央结果输入简直没关系疏忽不计。左侧中央的图显示了中央数据从Map任务发送到Reduce任务的网络速度。这个经过从第一个Map任务完成之后就滥觞迟缓发动了。图示的第一个岑岭是发动了第一批概略1700个Reduce任务(整个MapReduce漫衍到概略1700台机器上,每台机器1次最多实施1个Reduce任务)。排序次第运转大约300秒后,第一批发动的Reduce任务有些完成了,我们滥觞实施剩下的Reduce任务。全面的料理在大约600秒后结果。左下图表示Reduce任务把排序后的数据写到最终的输入文件的速度。在第一个排序阶段结果和数据滥觞写入磁盘之间有一个小的延时,这是由于worker机器正在忙于排序中央数据。磁盘写入速度在2-4GB/s继续一段时间。输入数据写入磁盘大约继续850秒。计入初始发动局部的时间,整个运算消耗了891秒。这个速度和TeraSort standard[18]的最高纪录1057秒相差不多。相比看莱特币挖币收益行情。

还有一些值得注意的景象:输入数据的读取速度比排序速度和输入数据写入磁盘速度要高不少,这是由于我们的输入数据当地化优化战略起了作用—绝大局部数据都是从当地硬盘读取的,从而撙节了网络带宽。排序速度比输入数据写入到磁盘的速度快,这是由于输入数据写了两份(我们使用了2路的GFS文件编制,写入复制节点的原因是为了保证数据靠得住性和可用性)。我们把输入数据写入到两个复制节点的原因是由于这是底层文件编制的保证数据靠得住性和可用性的完毕机制。假如底层文件编制使用近似容错编码[14](erwhilsturecoding)的方式而不是复制的方式保证数据的靠得住性和可用性,那么在输入数据写入磁盘的时候,就没关系低沉网络带宽的使用。

5.4、高效的bummistance任务图三(b)显示了封闭了备用任务后排序次第实施情状。实施的经过和图3(a)很相似,除了输入数据写磁盘的手脚在时间上拖了一个很长的尾巴,而且在这段时间里,简直没有什么写入手脚。在960秒后,惟有5个Reduce任务没有完成。这些拖后腿的任务又实施了300秒才完成。整个计算消耗了1283秒,多了44%的实施时间。5.5、生效的机器在图三(c)中演示的排序次第实施的经过中,我们在次第滥觞后几分钟蓄志的kill了1746个worker中的200个。集群底层的调度速即在这些机器上重新滥觞新的worker料理进程(由于只是worker机器上的料理进程被kill了,机器自身还在作事)。图三(c)显示出了一个“负”的输入数据读取速度,这是由于一些已经完成的Map任务丧失了(由于相应的实施Map任务的worker进程被kill了),必要重新实施这些任务。相关Map任务很快就被重新实施了。整个运算在933秒内完成,包括了初始发动时间(只比一般实施多消耗了5%的时间)。6、履历我们在2003年1月完成了第一个版本的MapReduce库,在2003年8月的版本有了明显的加强,这包括了输入数据当地优化、worker机器之间的静态负载平衡等等。从那今后,我们欣喜的发现,MapReduce库能广大应用于我们日常作事中遇到的各类题目。它现在在Google外部各个领域获得广大应用,包括:大范畴机器练习题目Google News和Froogle产品的集群题目从公家查询产品(歧Google的Zeitgeist)的呈报中抽取数据。从多量的新应用和新产品的网页中提取有用信息(歧,从多量的位置探求网页中抽取地舆位相信息)。大范畴的图形计算。图四显示了在我们的源代码管理编制中,随着时间推移,独立的MapReduce次第数量的明显增加。从2003年早些时候的0个增加到2004年9月份的差不多900个不同的次第。MapReduce的告捷取决于采用MapReduce库能够在不到半个小时时间内写出一个浅易的次第,这个浅易的次第能够在上千台机器的组成的集群上做大范畴并发料理,这极大的加速了建设和原形设计的周期。另外,采用MapReduce库,没关系让完全没有漫衍式和/或并行编制建设履历的次第员很容易的哄骗多量的资源,开收回漫衍式和/或并行料理的应用。

在每个任务结果的时候,MapReduce库统计计算资源的使用状况。在表1,我们列出了2004年8月份MapReduce运转的任务所占用的相关资源。中文版。

6.1、大范畴索引到目前为止,MapReduce最告捷的应用就是重写了Google网络探求任职所使用到的index编制。索引编制的输入数据是网络爬虫抓取回来的海量的文档,这些文档数据都生存在GFS文件编制里。这些文档原始形式(woulscoholx注:rawcontents,我以为就是网页中的剔除html标识表记标帜后的形式、pdf和word等有格式文档中提取的文本形式等)的大小凌驾了20TB。索引次第是经过一系列的MapReduce操作(大约5到10次)来建立索引。使用MapReduce(调换上一个特别设计的、漫衍式料理的索引次第)带来这些便宜:完毕索引局部的代码浅易、玲珑、容易理解,由于对待容错、漫衍式以及并行计算的料理都是MapReduce库提供的。歧,使用MapReduce库,计算的代码行数从原来的3800行C++代码削减到概略700行代码。MapReduce库的本能机能已经足够好了,所以我们没关系把在概念上不相关的计算步骤隔离料理,而不是混在一起以期削减数据通报的出格消耗。概念上不相关的计算步骤的隔离也使得我们没关系很容易转换索引料理方式。歧,对之前的索引编制的一个小更改可能要奢侈好几个月的时间,但是在使用MapReduce的新编制上,这样的更改只必要花几地利间就没关系了。索引编制的操作管理更容易了。由于由机器生效、机器料理速度迟缓、以及网络的刹时停滞等惹起的绝大局部题目都已经由MapReduce库解决了,不再必要操作人员的介入了。另外,我们没关系经过在索引编制集群中增加机器的简方子法进步整体料感本能机能。7、相关作事很多编制都提供了庄敬的编程形式,并且经过对编程的庄敬限制来完毕并行计算。例如,一个结合函数没关系经过把N个元素的数组的前缀在N个料理器上使用并行前缀算法,在logN的时间内计算完[6,9,13](woulscoholx注:完全没有明白作者在说啥,整个参考相关6、9、13文档)。MapReduce没关系看作是我们结合在真实环境下料理海量数据的履历,对这些典范模型实行简化和萃取的成绩。越发值得自高的是,我们还完毕了基于上千台料理器的集群的容错料理。相比而言,大局部并发料理编制都只在小范畴的集群上完毕,并且把容错料理交给了次第员。Bulk SynchronousPrograreming[17]和一些MPI原语[11]提供了更初级别的并行料理笼统,没关系更容易写出并行料理的次第。MapReduce和这些编制的关键不同之处在于,MapReduce哄骗限制性编程形式完毕了用户次第的主动并发料理,并且提供了透亮的容错料理。我们数据当地优化战略的灵感原因于in service disks[12-15]等技术,你看谷歌。在in servicedisks中,计算任务是尽量推送到数据存储的节点料理(woulscoholx注:即靠拢数据源料理),这样就削减了网络和IO子编制的吞吐量。我们在挂载几个硬盘的普通机器上实施我们的运算,而不是在磁盘料理器上实施我们的作事,但是到达的目的一样的。我们的备用任务机制和CharlotteSystem[3]提出的eager调度机制比力近似。Eager调度机制的一个缺点是假如一个任务屡次生效,那么整个计算就不能完成。我们经过疏忽惹起阻碍的记载的方式在某种水平上解决了这个题目。MapReduce的完毕依赖于一个外部的集群管理编制,这个集群管理编制负担在一个超大的、共享机器的集群上漫衍和运转用户任务。事实上比特币为什么是p2p。固然这个不是本论文的重点,但是有必要提一下,这个集群管理编制在理念上和其它编制,如Condor[16]是一样。MapReduce库的排序机制和NOW-Sort[1]的操作上很近似。读取输入源的机器(mapworkers)把待排序的数据实行分区后,发送到R个Reduce worker中的一个实行料理。每个Reduceworker在当地对数据实行排序(尽可能在内存中排序)。当然,NOW-Sort没有给用户自定义的Map和Reduce函数的机缘,所以不齐备MapReduce库广大的适用性。River[2]提供了一个编程模型:料理进程经过漫衍式队列传送数据的方式实行相互通讯。和MapReduce近似,River编制尝试在不对等的硬件环境下,或者在编制振动的情状下也能提供近似均匀的本能机能。River是经过细心调度硬盘和网络的通讯来平衡任务的完成时间。MapReduce库采用了其它的方法。经过对编程模型实行限制,MapReduce框架把题目剖判成为多量的“小”任务。这些任务在可用的worker集群上静态的调度,这样迅速的worker就没关系实施更多的任务。经过对编程模型实行限制,我们可用在作事接近完成的时候调度备用任务,比特币计算什么。收缩在硬件配置不平衡的情状下缩小整个操作完成的时间(歧有的机器本能机能差、或者机器被某些操作停滞了)。BAD-FS[5]采用了和MapReduce完全不同的编程形式,它是面向广域网(woulscoholx注:wide-neighborhoodnetwork)的。不过,这两个编制有两个基础功用很近似。(1)两个编制采用重新实施的方式来防止由于生效招致的数据丧失。(2)两个都使用数据当地化调度战略,削减网络通讯的数据量。

TACC[7]是一个用于简化布局高可用性网络任职的编制。和MapReduce一样,它也依附重新实施机制来完毕的容错料理。

8、结果语MapReduce编程模型在Google外部告捷应用于多个领域。我们把这种告捷归结为几个方面:首先,由于MapReduce封装了并行料理、容错料理、数据当地化优化、负载平衡等等技术难点的细节,这使得MapReduce库易于使用。即使对待完全没有并行或者漫衍式编制建设履历的次第员而言;其次,多量不同类型的题目都没关系经过MapReduce浅易的解决。歧,MapReduce用于生成Google的网络探求任职所必要的数据、用来排序、用来数据挖掘、用于机器练习,以及很多其它的编制;第三,我们完毕了一个在数千台计算机组成的大型集群上活泼部署运转的MapReduce。这个完毕使得有用哄骗这些富厚的计算资源变得非常浅易,所以也适合用来解决Google遇到的其他很多必要多量计算的题目。

我们也从MapReduce建设经过中学到了不少东西。首先,统制编程形式使得并行和漫衍式计算非常容易,也易于布局容错的计算环境;其次,网络带宽是有数资源。多量的编制优化是针对削减网络传输量为目的的:当地优化战略使多量的数据从当地磁盘读取,中央文件写入当地磁盘、并且只写一份中央文件也节约了网络带宽;第三,屡次实施相同的任务没关系削减本能机能迟缓的机器带来的反面影响(woulscoholx注:即硬件配置的不平衡),同时解决了由于机器生效招致的数据丧失题目。

9、谢谢(woulscoholx注:还是原汁原味的谢谢词比力好,这个就不翻译了)JoshLevenalwaysrg halwayscause held itwouls pl_ design instrumentwouls in revising and extending theuser-level MapReduce API with a considerin a very numalwaysr of new features primarily more than hisexperience with using MapReduce and folks’s suggestions forenhancements. MapReduce relistings its input from and writes its outputto the Google File System [8]. We would like to thank Mohit Aron-Howard Goresourceff- Markus Gutschke- Denthusiwhilsttic Krareer- Shun-Tak Leung- andJosh Redstone for their work in developing GFS. We would possibly even loveto thank Percy Liang and Olcan Sercinoglu for their work indeveloping the cluster management system used by MapReduce. MikeBurrows- Wilson Hsieh- Josh Levenalwaysrg- Sharon Perl- Rob Pike- andDebby Wwoulslvery single provided helpful comments on earlier drafts of thispaper.The incognito OSDI reviewers- and our shepherd- Eric Brewer-provided myour useful suggestions of plhwoulsf truthsets thwithin paper could alwaysimproved. Finvery alwaysst friend- we thank every single one of these the users of MapReduce withinGoogle’s engineering organiz for providing helpful feedspine-suggestions- and bother reports.10、参考原料[1] Andrea C. Arphvaci-Dusseau- Remzi H. Arphvaci-Dusseau-Denthusiwhilsttic E.Culler- Joseph M. Hellerstein- and Denthusiwhilsttic A.Patterson.High-performance sorting on networks of worksts.InProceedings of the 1997 ACM SIGMOD InternwoulsConference onManagement of Data- Tucson-Arizona- May 1997.
[2] Remzi H. Arphvaci-Dusseau- Eric Anderson- Nogoodness meTreuhaft- Denthusiwhilsttic E.Culler- Joseph M. Hellerstein- Denthusiwhilsttic Patterson- and Kathy Yelick.Cluster I/O with River:Msimilarg the fwhilstt cautomotive service engineers common. In Proceedingsof the Sixth Workshop on Input/Output in Parwoulslel and DistrionlyedSystems (IOPADS ’99)- pgrows older 10.22- Atlisha- Georgia- May1999.
[3] Arlung burning whilsth Barthe atlanta areaoo- Mehmet Karaul- Zvi Kedem- and Peter Wyckoff.Charlotte: Methvacomputing on the web. In Proceedings of the 9thInternwouls Conference on Parwoulslel and Distrionlyed ComputingSystems- 1996. [4] Luiz A. Barroso- Jeffrey Dean- and Urs H¨olzle.Web semid-foot for a stringestedgyet: The Google cluster design. IEEEMicro- 23(2):22.28- April 2003.
[5] John Bent- Douglwhilst Thain- Andrea C.Arphvaci-Dusseau- Remzi H.Arphvaci-Dusseau- and Miron Livny. Explicit control in an order-concerneddistrionlyed file system. In Proceedings of the 1st USENIX Symposiumon Networked Systems Design and Implement NSDI- Mmid-foot2004.
[6] Guy E. Blelloch. Scans whilst primitive parwoulslel opers.IEEETransmovements on Computers- C-38(11)- Novemalwaysr 1989.
[7] Armando Fox- Steven D. Gribble- Yatin Chawathe- Eric A. Brewer-and Paul Gauthier. Cluster-primarily scwoulsin a very network services. InProceedings of the 16th ACM Symposium on Operating SystemPrinciples- pgrows older 78. 91- Saint-Mwoulso- France- 1997.
[8] Sanjay Ghemawat- Howard Goresourceff- and Shun-Tak Leung. The Googlefile system. In 19th Symposium on Operating Systems Principles-pgrows older 29.43- Lake George- New York- 2003. To can always purchautomotive service engineersd in OSDI
[9] S. Gorlatch. Systematic efficient parwoulsleliz of scan andother list homomorphisms. In L. Bouge- P. Fraigniaud- A. Mignotte-and Y. Roalwaysrt- editors- Euro-Par’96. Parwoulslel Processing- LectureNotes in Computer Science 1124- pgrows older 401.408. Springer-Verlag-1996.
[10] Jim Gray. Sort standard home page..
[11] Williare Gropp- Ewing Lusk- and Anthony Skjellum. Using MPI:Portin a very Parwoulslel Prograreming with the Message-Pbumming Interf_ design.MIT Press- Carebrdge- MA- 1999.
[12] L. Huston- R. Sukthankar- R.Wickremesinghe- M. Satyanarayanan-G. R. Gfury- E. Riedel- and A. Ailareaki. Diareond: A storcontra-queesign for early discard in interin service semid-foot. InProceedings of the 2004 USENIX File and Storage Technologies FASTConference- April 2004.
[13] Richard E. Ladvertising carepaignner and Michael J. Fischer. Parwoulslel prefixcomput. Journwouls of the ACM- 27(4):831.838- 1980.
[14] Michael O. Rhvacan. Efficient disperswouls of inform forsecurity- loadvertising carepaign controlling and fault tolerance. Journwouls of the ACM-36(2):335.348- 1989.
[15] Erik Riedel- Christos Fwoulsoutsos- Gcrafth A. Gibaloneyon- and DenthusiwhilstticNagle. Active disks for large-scwoulscohol datan experienced guitaristcedureing. IEEE Computer-pgrows older 68.74- June 2001.
[16] Douglwhilst Thain- Todd Tannenbaum- and Miron Livny. Distrionlyedcomputing in prenhvactmentice: The Condor experience. Concurrency andComput: Prenhvactmentice and Experience- 2004.
[17] L. G. Vwoulsiish. A linking model for parwoulslel comput.Communics of the ACM- 33(8):103.111- 1997.
[18] Jim Wyllie. Spsort: How to sort a terabdominwouls exercisesyte quickly..附录A、单词频次统计本节包括了一个完美的次第,用于统计在一组命令行指定的输入文件中,每一个不同的单词出现频次。
#include“mpaybhvack ringestedseduce/mpaybhvack ringestedseduce.h”

// User’s map function
clbumm WordCounter : public Msoftwcontinue to alwayser {
public:
virtuwouls void Map(constMapInput&rev; input) {
conststring&rev; text = input.vwoulsue();
const int n =text.size();
for (int i =0; i < n; ) {
//Skip pwhilstt ledriving instructorng whitesp_ design
while((i < n) &rev;&rev; issp_ design(text[i]))
i++;

//Find word end
int stcraft =i;
while ((i< n) &rev;&rev; !issp_ design(text[i]))
i++;
if (stcraft< i)
Emit(text.subaloneytr(stcraft-i-stcraft)-”1″);
}
}
};

REGISTER_MAPPER(WordCounter);

// User’s reduce function
clbumm Adder : public Reducer {
virtuwouls void Reduce(ReduceInput* input) {
// Iteringested over woulsl entrieswith the
// saree key nicelydd thevwoulsues
int64 vwoulsue = 0;
while (!input->done()){
vwoulsue +=StringToInt(input->vwoulsue());
input->NextVwoulsue();
}

// Emit sumfor input->key()
Emit(IntToString(vwoulsue));
}
};

REGISTER_REDUCER(Adder);

int main(int argc- char** argv){
ParseCommandLineFlags(argc- argv);
MapReduceSpecific spec;
// Store list of input files into “spec”
for (int i = 1; i < argc; i++) {
MapReduceInput* input =spec.advertising carepaignd more_input();
input->set_format(“text”);
input->set_filepattern(argv[i]);
input->set_msoftwcontinue to alwayser_clbumm(“WordCounter”);
}

// Specify theoutput files:
// /gfs/test/freq-00000-of-00100
// /gfs/test/freq-00001-of-00100
// …
MapReduceOutput* out = spec.output();
out->set_filebautomotive service engineers(“/gfs/test/freq”);
out->set_num_tinquires(100);
out->set_format(“text”);
out->set_reducer_clbumm(“Adder”);
// Optionwouls: do pcraftiwouls sums within map
// tinquires to saudio-videoe network data transfer useage
out->set_comcaner_clbumm(“Adder”);

// Tuningparareeters: use no more than 2000
// mvery singleines and 100 MB of memory per ttry to whilstk
spec.set_mvery singleines(2000);
spec.set_map_megabdominwouls exercisesytes(100);
spec.set_reduce_megabdominwouls exercisesytes(100);
// Now run it
MapReduceResult result;
if (!MapReduce(spec- &rev;result)) abdominwouls exercisesort();
// Done: ‘result’ structure contains info
// woulsmost counters- time taken- numalwaysr of
// mvery singleines used- etc.
return 0;
}


想知道coinegg官网

版权保护: 本文由 主页 原创,转载请保留链接: http://www.yunfub.cc//xueyuan/cms/7239.html