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

By admin in 亚洲必赢app在哪下载 on 2019年3月22日

Google MapReduce中文版

    译者: alex

 

摘要

MapReduce是一个编制程序模型,也是三个甩卖和转移超大数据集的算法模型的连锁落实。用户率先创造2个Map函数处理2个基于key/value
pair的数量集合,输出中间的根据key/value
pair的数目集合;然后更创制3个Reduce函数用来归并全数的享有同样中间key值的高级中学级value值。现实世界中有那几个知足上述处理模型的事例,本随想将详细描述这些模型。

 

MapReduce架构的顺序能够在多量的平常布局的电脑上贯彻并行化处理。这么些体系在运作时只关心:如何划分输入数据,在大量计算机组成的集群上的调度,集群中计算机的错误处理,管理集群中总计机之间需要的通讯。接纳MapReduce架构能够使那2个尚未并行总括和分布式处理系统开发经历的程序员有效选用分布式系统的丰盛能源。

 

我们的MapReduce落成运维在规模足以灵活调整的由平日机器组成的集群上:贰个超人的MapReduce总计往往由几千台机器组成、处理以TB总计的多少。程序员发现这么些连串足够好用:已经达成了巨大的MapReduce程序,在谷歌的集群上,每一日都有1000多个MapReduce程序在推行。

1、介绍

在过去的5年里,蕴含本文作者在内的谷歌(Google)的诸多程序员,为了处理海量的本来数据,已经落实了巨大的、专用的盘算办法。这一个计算方式用来处理大批量的原本数据,比如,文书档案抓取(类似互联网爬虫的次序)、Web请求日志等等;也为了总计处理各种类型的衍生数据,比如倒排索引、Web文书档案的图结构的各样表示时势、每台主机上网络爬虫抓取的页面数量的集聚、每日被呼吁的最多的询问的聚集等等。超过四分之一如此的数码处理运算在概念上很不难明白。但是由于输入的数据量巨大,因而要想在可接受的年月内到位运算,唯有将这一个计算分布在许多的主机上。怎么样处理并行总结、如何分发数据、如何处理错误?全数那么些难题汇总在一块儿,要求大批量的代码处理,由此也使得原本不难的演算变得难以处理。

 

为了化解上述复杂的题材,我们统一筹划1个新的肤浅模型,使用那么些抽象模型,大家假诺宣布大家想要执行的粗略运算即可,而毋庸关怀并行计算、容错、数据分布、负载均衡等复杂的底细,这个题材都被封装在了二个Curry面。设计那一个抽象模型的灵感来源于Lisp和广大其余函数式语言的Map和Reduce的原语。大家发现到大家超过4/8的演算都饱含那样的操作:在输入数据的“逻辑”记录上选用Map操作得出两当中路key/value
pair集合,然后在享有拥有同样key值的value值上应用Reduce操作,从而完成统一中间的数码,获得3个想要的结果的目标。使用MapReduce模型,再组成用户达成的Map和Reduce函数,我们就能够10分不难的贯彻大规模并行化计算;通过MapReduce模型自带的“再一次实施”(re-execution)效率,也提供了初级的容灾落成方案。

 

其一工作(实现2个MapReduce框架模型)的首要贡献是由此容易的接口来兑现全自动的并行化和宽广的分布式计算,通过应用MapReduce模型接口达成在大气日常的PC机上高品质计算。

 

第壹有的讲述基本的编制程序模型和一部分行使案例。第3片段讲述了一个通过裁剪的、适合我们的依照集群的持筹握算环境的MapReduce实现。第5有的讲述我们以为在MapReduce编程模型中部分实用的技能。第陆片段对此各个差异的天职,度量大家MapReduce完成的性质。第伍有些揭露了在谷歌(Google)内部怎么着利用MapReduce作为基础重写大家的目录系统成品,包含别的一些选取MapReduce的阅历。第8片段谈谈相关的和以后的办事。

贰 、编制程序模型

MapReduce编制程序模型的原理是:利用多少个输入key/value
pair集合来产生四个输出的key/value
pair集合。MapReduce库的用户用多个函数表达这一个总括:Map和Reduce。

 

用户自定义的Map函数接受1个输入的key/value
pair值,然后发生叁在那之中档key/value
pair值的成团。MapReduce库把富有拥有同等中间key值I的中级value值集合在一起后传递给reduce函数。

 

用户自定义的Reduce函数接受三个中间key的值I和相关的贰个value值的聚众。Reduce函数合并这么些value值,形成一个较小的value值的成团。一般的,每便Reduce函数调用只爆发0或1个出口value值。日常我们通过二个迭代器把高中级value值提必要Reduce函数,那样我们就足以处理不恐怕全体放入内部存储器中的恢宏的value值的会晤。

2.1、例子

譬如,总括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函数是1个恒等函数,即把高级中学级数据复制到输出。
  • 算算UKugaL访问频率:Map函数处理日志中web页面请求的记录,然后输出(UQashqaiL,1)。Reduce函数把相同U奥迪Q7L的value值都抬高起来,产生(U奥德赛L,记录总数)结果。
  • 倒转网络链接图:Map函数在源页面(source)中追寻全体的链接指标(target)并出口为(target,source)。Reduce函数把给定链接指标(target)的链接组合成贰个列表,输出(target,list(source))。
  • 每一个主机的物色词向量:检索词向量用一个(词,频率)列表来概述出今后文书档案或文书档案集中的最重点的片段词。Map函数为每叁个输入文书档案输出(主机名,检索词向量),当中主机名来自文书档案的URL。Reduce函数接收给定主机的具备文档的寻找词向量,并把那个招来词向量加在一起,放任掉低频的检索词,输出贰个末尾的(主机名,检索词向量)。
  • 倒排索引:Map函数分析各类文书档案输出3个(词,文书档案号)的列表,Reduce函数的输入是二个给定词的富有(词,文书档案号),排序全体的文书档案号,输出(词,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值分成Tiggo个差异分区(例如,hash(key)
mod
哈弗),Reduce调用也被分布到多台机械上执行。分区数量(Odyssey)和分区函数由用户来钦命。

亚洲必赢app在哪下载 1

图1显示了笔者们的MapReduce完结中操作的整个流水生产线。当用户调用MapReduce函数时,将发生上面包车型地铁一多级动作(上面包车型地铁序号和图第11中学的序号一一对应):
1.用户程序首先调用的MapReduce库将输入文件分为M个数据片度,每种数据片段的高低相似从
16MB到64MB(可以经过可选的参数来控制各类数据片段的大大小小)。然后用户程序在机群中开创大气的先后副本。 (alex:copies
of the program还真难翻译)

2.那些程序副本中的有3个与众不相同的程序–master。副本中其余的顺序都以worker程序,由master分配职责。有M个Map职责和XC捌拾捌个Reduce职务将被分配,master将一个Map任务或Reduce职务分配给3个悠闲的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程序发来的数额存款和储蓄地点新闻后,使用QX56PC从Map
worker所在主机的磁盘上读取这个缓存数据。当Reduce
worker读取了颇具的中等数据后,通过对key进行排序后使得全体同样key值的数码聚合在一道。由于众多不比的key值会映射到同一的Reduce职务上,因而必须开展排序。假诺中间数据太大不可能在内部存款和储蓄器中完结排序,那么就要在外表进行排序。
6.Reduce
worker程序遍历排序后的中游数据,对于每三个唯一的中间key值,Reduce
worker程序将以此key值和它相关的高级中学级value值的联谊传递给用户自定义的Reduce函数。Reduce函数的出口被追加到所属分区的输出文件。
7.当全部的Map和Reduce职分都达成未来,master唤醒用户程序。在这些时候,在用户程序里的对MapReduce调用才回去。

 

在功成名就做到职分之后,MapReduce的输出存放在汉兰达个出口文件中(对应每种Reduce职分爆发叁个输出文件,文件名由用户钦点)。一般意况下,用户不须求将那GL4肆拾多少个出口文件合并成贰个文本–他们平时把那些文件作为其余3个MapReduce的输入,或许在别的1个足以处理多少个分叉文件的分布式应用中使用。

3.贰 、Master数据结构

Master持有一些数据结构,它存款和储蓄每三个Map和Reduce职分的图景(空闲、工作中或形成),以及Worker机器(非空闲任务的机械)的标识。

 

Master就像是三个多少管道,中间文件存款和储蓄区域的职位音信通过那个管道从Map传递到Reduce。由此,对于每一个已经成功的Map职务,master存款和储蓄了Map职分发生的普拉多当中间文件存款和储蓄区域的尺寸和地方。当Map任务完结时,Master接收到地方和尺寸的换代新闻,这么些新闻被日渐递增的推送给那个正在干活的Reduce职责。

3.3、容错

因为MapReduce库的宏图初衷是行使由许多的机械组成的集群来处理超大规模的数量,所以,这几个库必须求能很好的处理机器故障。

worker故障 master周期性的ping每一个worker。即使在1个约定的时光限定内尚未接收worker重回的音信,master将把这些worker标记为失效。全部由这几个失效的worker完毕的Map职分被重设为伊始的空闲状态,之后那么些职责就足以被陈设给其它的worker。同样的,worker失效时正值周转的Map或Reduce职责也将被重新置为空闲状态,等待重新调度。

 

当worker故障时,由于已经成功的Map义务的出口存款和储蓄在那台机械上,Map任务的输出已不足访问了,因而必须再度履行。而已经完结的Reduce义务的出口存款和储蓄在全局文件系统上,因此不必要再度实施。

 

当1个Map职责首先被worker A执行,之后由于worker A失效了又被调度到worker
B执行,那个“重新履行”的动作会被通报给全部执行Reduce义务的worker。任何还不曾从worker
A读取数据的Reduce职务将从worker B读取数据。

 

MapReduce能够拍卖大规模worker失效的气象。比如,在四个MapReduce操作实施时期,在正在运维的集群上拓展互联网维护引起80台机器在几分钟内不足访问了,MapReduce
master只须求不难的重新实施那些不可访问的worker达成的工作,之后继续执行未成功的天职,直到最终成功那几个MapReduce操作。

 

master失败
二个简约的化解办法是让master周期性的将地点描述的数据结构(alex注:指3.2节)的写入磁盘,即检查点(checkpoint)。假诺那几个master任务失效了,能够从最后二个检查点(checkpoint)开端起步另一个master进程。不过,由于唯有3个master进度,master失效后再回复是比较费心的,由此大家今日的落到实处是只要master失效,就一噎止餐MapReduce运算。客户能够检查到这几个场地,并且能够依照须要再次履行MapReduce操作。

 

在失效方面包车型大巴拍卖体制
*
(alex注:原文为”semantics in the presence of failures”)*
当用户提供的Map和Reduce操作是输入分明性函数(即一律的输入发生相同的出口)时,大家的分布式达成在别的动静下的输出都和有着程序尚未现身别的错误、顺序的履行发生的出口是均等的。

 

大家赖以对Map和Reduce职责的出口是原子提交的来成功这些特点。每一个工作中的职分把它的出口写到私有的权且文件中。每一种Reduce职分生成四个这么的文书,而各样Map任务则生成R个这样的公文(3个Reduce职责对应3个文书)。当一个Map职分到位的时,worker发送三个富含Odyssey个一时文件名的形成新闻给master。要是master从3个业已成功的Map任务再一次接受到到贰个达成音讯,master将忽略这么些音讯;不然,master将那奥迪Q多个公文的名字记录在数据结构里。

 

当Reduce任务完毕时,Reduce
worker进度以原子的方法把权且文件重命名为终极的出口文件。假诺同2个Reduce任务在多台机器上实行,针对同2个最终的出口文件将有多少个重命名操作实施。大家依靠底层文件系统提供的重命名操作的原子性来保管最后的文件系统状态唯有包涵3个Reduce任务发生的多少。

 

选取MapReduce模型的程序员能够很简单的明白他们先后的一坐一起,因为我们超过一半的Map和Reduce操作是强烈的,而且存在这么的二个真情:大家的失效处理机制等价于八个依次的实践的操作。当Map或/和Reduce操作是不领悟的时候,大家提供尽管较弱可是仍旧合理的处理机制。当使用非鲜明操作的时候,2个Reduce任务奥迪Q51的出口等价于三个非显明性程序顺序执行发生时的输出。可是,另2个Reduce职分中华V2的出口恐怕符合三个分化的非分明顺序程序执行爆发的智跑2的出口。

 

考虑Map任务M和Reduce职分智跑壹 、中华V2的动静。大家设定e(Ri)是Ri已经交由的实施进度(有且仅有贰个这么的实践进度)。当e(大切诺基1)读取了由M贰遍执行发生的出口,而e(Haval2)读取了由M的另3回实施发生的出口,导致了较弱的失灵处理。

3.肆 、存款和储蓄地方

在大家的乘除运转条件中,互连网带宽是八个十分紧张的能源。大家经过尽量把输入数据(由GFS管理)存款和储蓄在集群中机器的本土磁盘上来节省网络带宽。GFS把种种文件按64MB3个Block分隔,各类Block保存在多台机器上,环境中就存放了多份拷贝(一般是三个拷贝)。MapReduce的master在调度Map职责时会考虑输入文件的岗位音信,尽量将三个Map职责调度在含蓄相关输入数据拷贝的机器上进行;倘诺上述努力战败了,master将尝试在保存有输入数据拷贝的机械附近的机械上进行Map职责(例如,分配到1个和带有输入数据的机器在叁个switch里的worker机器上实施)。当在2个足足大的cluster集群上运营大型MapReduce操作的时候,大多数的输入数据都能从地点机械读取,因而消耗格外少的网络带宽。

3.五 、任务粒度

如前所述,我们把Map拆分成了M个片段、把Reduce拆分成Rubicon个部分执行。理想图景下,M和Rubicon应当比集群中worker的机器数量要多得多。在每台worker机器都履行大气的两样职分能够抓实集群的动态的负载均衡能力,并且能够加速故障恢复生机的进程:失效机器上进行的雅量Map职务都得以分布到全数别的的worker机器上去执行。

 

然则其实,在大家的现实性完成中对M和奥迪Q7的取值都有必然的合理限制,因为master必须执行O(M+Wrangler)次调度,并且在内部存款和储蓄器中保存O(M*Odyssey)个情景(对影响内部存款和储蓄器使用的因素依然相比小的:O(M*Highlander)块状态,大概每对Map任务/Reduce任务一个字节就足以了)。

 

更进一步,纳瓦拉值常常是由用户钦命的,因为各种Reduce职分最后都会生成3个独自的出口文件。实际使用时大家也赞同于选拔适宜的M值,以使得每三个单身职务皆以拍卖大约16M到64M的输入数据(那样,下面描写的输入数据本地存款和储蓄优化策略才最有效),其它,大家把奥德赛值设置为我们想利用的worker机器数量的小的倍数。咱们平时会用那样的比例来施行MapReduce:M=300000,帕杰罗=五千,使用3000台worker机器。

3.六 、备用职分

影响叁个MapReduce的总执行时间最常见的成分是“落伍者”:在运算进度中,如若有一台机械花了不长的年华才完结末段多少个Map或Reduce职责,导致MapReduce操作总的执行时间超过预期。出现“落伍者”的来头越多。比如:假若3个机械的硬盘出了难点,在读取的时候要时常的开展读取纠错操作,导致读取数据的快慢从30M/s下落到1M/s。假使cluster的调度体系在那台机械上又调度了别样的天职,由于CPU、内部存款和储蓄器、本地硬盘和网络带宽等竞争因素的存在,导致执行MapReduce代码的执行功效进一步缓慢。大家近来遇上的一个难题是由于机械的起初化代码有bug,导致关闭了的总括机的缓存:在这个机器上进行职分的习性和正规意况相差上百倍。

 

我们有多少个通用的建制来压缩“落伍者”出现的景况。当贰个MapReduce操作看似成功的时候,master调度备用(backup)职责进程来施行剩下的、处于处理中状态(in-progress)的任务。无论是最初的实践进度、依旧备用(backup)职分进度完结了职分,大家都把这么些任务标记成为已经形成。大家调优了这一个机制,平日只会占有比符合规律操作多多少个百分点的测算能源。大家发现使用那样的体制对于滑坡超大MapReduce操作的总处理时间效果显着。例如,在5.3节描述的排序职责,在闭馆掉备用任务的事态下要多花48%的岁月成功排序职分。

 

4、技巧

尽管不难的Map和Reduce函数提供的基本功用已经能够满足超越1/4的计算必要,大家照旧发掘出了一部分有价值的壮大效用。本节将讲述那么些扩展成效。

4.① 、分区函数

MapReduce的使用者经常会钦命Reduce任务和Reduce职务输出文件的数量(Rubicon)。大家在中游key上应用分区函数来对数据举办分区,之后再输入到后续义务执行进程。七个缺省的分区函数是运用hash方法(比如,hash(key)
mod
本田UR-V)进行分区。hash方法能爆发十一分平衡的分区。但是,有的时候,别的的一对分区函数对key值实行的分区将那多少个有效。比如,输出的key值是U福睿斯Ls,大家期望每一种主机的有着条条框框保持在同一个输出文件中。为了援助类似的气象,MapReduce库的用户必要提供专门的分区函数。例如,使用“hash(Hostname(urlkey))
mod
凯雷德”作为分区函数就足以把拥有来自同1个主机的UEnclaveLs保存在同2个出口文件中。

4.二 、顺序保险

我们保障在给定的分区中,中间key/value
pair数据的拍卖顺序是比照key值增量顺序处理的。那样的相继保证对每一种分成生成三个稳步的输出文件,这对于急需对出口文件按key值随机存取的运用分外有意义,对在排序输出的数据集也很有帮带。

4.3、Combiner函数

在某个情况下,Map函数产生的中间key值的重复数据会占十分大的百分比,并且,用户自定义的Reduce函数满足结合律和交流律。在2.1节的词数总结程序是个很好的例子。由于词频率倾向于一个zipf分布(齐夫分布),各样Map职责将发出很多少个那样的记录<the,1>。全体的这几个记录将由此互连网被发送到2个独自的Reduce职责,然后由这几个Reduce职务把拥有这一个记录累加起来爆发一个数字。我们允许用户钦命3个可选的combiner函数,combiner函数首先在当地将那几个记录进行贰遍联合,然后将统一的结果再经过网络发送出去。

 

Combiner函数在每台执行Map职责的机器上都会被实践一回。一般景观下,Combiner和Reduce函数是一样的。Combiner函数和Reduce函数之间唯一的区分是MapReduce库怎么着控制函数的出口。Reduce函数的出口被保留在最终的输出文件里,而Combiner函数的输出被写到中间文件里,然后被发送给Reduce职务。

 

有的的合并中间结果能够显着的增高部分MapReduce操作的快慢。附录A包涵一个运用combiner函数的例证。

4.四 、输入和出口的档次

MapReduce库支持两种不一致的格式的输入数据。比如,文本情势的输入数据的每一行被视为是多少个key/value
pair。key是文本的偏移量,value是那一行的剧情。别的一种常见的格式是以key举行排序来存款和储蓄的key/value
pair的行列。各类输入类型的贯彻都不可能还是无法把输入数据分割成数据片段,该数量片段能够由单独的Map职责来进行继续处理(例如,文本方式的限量划分必须有限帮衬单独在每行的境界举行限制划分)。尽管多数MapReduce的使用者仅仅使用很少的预约义输入类型就满意要求了,可是使用者仍旧能够因而提供二个简约的Reader接口达成就能够帮助三个新的输入类型。

 

里德r并非一定要从文件中读取数据,比如,大家得以很简单的完毕二个从数据库里读记录的里德r,或许从内部存款和储蓄器中的数据结构读取数据的Reader。

恍如的,大家提供了有个别预定义的出口数据的项目,通过这么些预约义类型能够爆发差别格式的数目。用户选取类似添加新的输入数据类型的法子充实新的输出类型。

4.5、副作用

在某个意况下,MapReduce的使用者发现,倘诺在Map和/或Reduce操作进度中加进援救的出口文件会相比轻便。我们借助程序writer把那种“副功效”变成原子的和幂等的(alex注:幂等的指1个连接发出同样结果的数学生运动算)。平常应用程序首先把出口结果写到2个权且文件中,在出口全部数额之后,在动用系统级的原子操作rename重新命名这一个一时文件。

 

假若三个职分发生了三个出口文件,大家并未提供类似两等级提交的原子操作补助这种景色。由此,对于会生出八个出口文件、并且对于跨文件有一致性供给的任务,都无法不是醒目的天职。可是在骨子里运用进程中,那么些界定还从未给我们带来过辛勤。

4.六 、跳过损坏的笔录

偶然,用户程序中的bug导致Map可能Reduce函数在处理有个别记录的时候crash掉,MapReduce操作不能够顺遂达成。惯常的做法是修复bug后再行实施MapReduce操作,然则,有时候找出那几个bug并修复它们不是一件不难的事体;这么些bug也许是在第一方Curry边,而我们手下没有这么些库的源代码。而且在诸多时候,忽略一些有题指标记录也是能够承受的,比如在三个壮烈的数码集上进行总括分析的时候。大家提供了一种实施情势,在那种形式下,为了确定保障保证全体拍卖能两次三番实行,MapReduce会检查和测试哪些记录导致明确性的crash,并且跳过这么些记录不处理。

 

各类worker进度都安装了信号处理函数捕获内部存款和储蓄器段很是(segmentation
violation)和总线错误(bus
error)。在推行Map恐怕Reduce操作在此之前,MapReduce库通过全局变量保存记录序号。假使用户程序触发了三个体系信号,音讯处理函数将用“最终一口气”通过UDP包向master发送处理的最终一条记下的序号。当master看到在拍卖某条特定记录不断退步三遍时,master就标明着条记下须求被跳过,并且在下次再次履行有关的Map大概Reduce任务的时候跳过那条记下。

4.⑦ 、本地执行

调剂Map和Reduce函数的bug是这几个不方便的,因为其实履行操作时不仅是分布在系统中进行的,而且日常是在好几千台微型总结机上执行,具体的推行职责是由master进行动态调度的,这又大大增添了调剂的难度。为了简化调节和测试、profile和小圈圈测试,大家开发了一套MapReduce库的本地达成版本,通过采纳当地版本的MapReduce库,MapReduce操作在本地电脑上挨家挨户的举办。用户能够决定MapReduce操作的推行,能够把操作限制到特定的Map职务上。用户通过设定专门的注解来在地点执行他们的次序,之后就足以很不难的运用当地调节和测试和测试工具(比如gdb)。

4.⑧ 、状态新闻

master使用嵌入式的HTTP服务器(如Jetty)突显一组状态音信页面,用户能够监察和控制各样实践情况。状态音信页面展现了归纳计算执行的进程,比如曾经完毕了稍稍职分、有些许义务正在处理、输入的字节数、中间数据的字节数、输出的字节数、处理百分比等等。页面还蕴涵了指向种种职分的stderr和stdout文件的链接。用户依照这几个数据展望总结要求实施大概多久、是不是需求扩展额外的盘算财富。那一个页面也得以用来分析如曾几何时候总结执行的比预料的要慢。

 

其余,处于最顶层的场馆页面呈现了什么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,也许处理的German文书档案数量在拍卖的任何文书档案数量中属于合理限定。

5、性能

本节大家用在三个特大型集群上运营的八个总计来度量MapReduce的性质。3个测算在大概1TB的数量中展开一定的情势匹配,另贰个计算对大致1TB的数码开始展览排序。

 

那多个程序在大方的应用MapReduce的实际利用中是非凡独立的 —
一类是对数据格式实行更换,从一种表现情势转换为其它一种表现格局;另一类是从海量数据中抽取少一些的用户感兴趣的数据。

5.一 、集群配置

具有那一个程序都运转在一个光景由1800台机械构成的集群上。每台机器配置3个2G主频、帮忙超线程的IntelXeon处理器,4GB的物理内部存款和储蓄器,五个160GB的IDE硬盘和贰个千兆以太网卡。这么些机器配置在几个两层的树形交流网络中,在root节点大致有100-200GBPS的传导带宽。全体这一个机器都施用同样的安顿(对等安排),由此任意两点时期的网络来回时间低于1纳秒。

 

在4GB内存里,大概有1-1.5G用来周转在集群上的其他职务。测试程序在礼拜六清晨起始实施,那时主机的CPU、磁盘和网络基本上处于空闲状态。

5.2、GREP

那一个分布式的grep程序必要扫描大约10的13回方个由玖拾八个字节组成的记录,查找出现可能率较小的三个字符的格局(那一个方式在9233多少个记录中出现)。输入数据被拆分成差不离64M的Block(M=1四千),整个输出数据存放在2个文书中(Odyssey=1)。亚洲必赢app在哪下载 2

图2呈现了那几个运算随时间的处理进度。在这之中Y轴表示输入数据的处理速度。处理速度随着参预MapReduce总结的机械数量的充实而充实,当1764台worker参与总结的时,处理速度达到了30GB/s。当Map职责完结的时候,即在盘算初阶后80秒,输入的处理速度降到0。整个总结进度从开端到甘休一共花了大体上150秒。那包涵了大概一分钟的发端运转阶段。早先运维阶段消耗的年华包含了是把这么些程序传送到各类worker机器上的命宫、等待GFS文件系统打开一千个输入文件集合的年月、获取有关的文书本地地方优化音讯的小时。

5.3、排序

排序程序处理10的15遍方个九十几个字节组成的记录(大致1TB的数量)。那些顺序模仿TeraSort
benchmark[10]。

 

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

 

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

亚洲必赢app在哪下载, 

在那些benchmark测试中,大家采纳的分区函数知道key的分区情形。常常对于排序程序来说,大家会大增3个预处理的MapReduce操功用于采集样品key值的分布意况,通过采集样品的多少来计量对最后排序处理的分区点。

亚洲必赢app在哪下载 3

图三(a)呈现了这几个排序程序的常规执行进程。左上的图呈现了输入数据读取的进程。数据读取速度峰值会达到13GB/s,并且有着Map职分成功之后,即大概200秒现在急迅度滑冰落到0。值得注意的是,排序程序输入数据读取速度低于分布式grep程序。那是因为排序程序的Map职务花了大约二分一的拍卖时间和I/O带宽把高级中学级输出结果写到本地硬盘。相应的分布式grep程序的中等结果输出大约能够忽略不计。

 

左手中间的图显示了中档数据从Map义务发送到Reduce任务的网络速度。这些进度从第多少个Map职分实现之后就起来减缓起步了。图示的第三个高峰是开发银行了第③批大约1700个Reduce职分(整个MapReduce分布到大体1700台机器上,每台机器叁回最多执行2个Reduce职分)。排序程序运转大致300秒后,第1批运营的Reduce职责有点完结了,我们初叶实施剩下的Reduce职分。全部的拍卖在大约600秒后完工。

 

左下图表示Reduce职务把排序后的数目写到最后的输出文件的速度。在首先个排序阶段甘休和数量开头写入磁盘之间有三个小的延时,那是因为worker机器正在勤奋排序中间数据。磁盘写入速度在2-4GB/s持续一段时间。输出数据写入磁盘大致持续850秒。计入起首运行部分的日子,整个运算消耗了891秒。那些速度和TeraSort
benchmark[18]的参天纪录1057秒相差不多。

 

还有一部分值得注意的景观:输入数据的读取速度比排序速度和出口数据写入磁盘速度要高不少,那是因为大家的输入数据本地化优化策略起了成效—
绝超过47%多少都以从本地硬盘读取的,从而省去了网络带宽。排序速度比出口数据写入到磁盘的速度快,这是因为出口数据写了两份(我们应用了2路的GFS文件系统,写入复制节点的缘故是为着保险数据可信赖性和可用性)。我们把出口数据写入到八个复制节点的原委是因为这是底层文件系统的保障数据可相信性和可用性的兑现机制。假诺底层文件系统使用类似容错编码[14](erasure
coding)的法子而不是复制的法子保险数据的可信性和可用性,那么在输出数据写入磁盘的时候,就足以下跌互联网带宽的选择。

5.4、高效的backup任务

图三(b)展现了关门了备用任务后排序程序执市场价格况。执行的经过和图3(a)很相似,除了输出数据写磁盘的动作在时刻上拖了三个不长的尾巴,而且在那段时光里,差不多一贯不怎么写入动作。在960秒后,唯有几个Reduce职务没有做到。这么些拖后腿的职责又实行了300秒才实现。整个总计消耗了1283秒,多了60%的推行时间。

5.五 、失效的机器

在图三(c)中示范的排序程序执行的进程中,大家在程序初阶后几分钟有意的kill了174五个worker中的200个。集群底层的调度及时在这几个机器上海重机厂复开首新的worker处理进度(因为只是worker机器上的拍卖进度被kill了,机器本人还在工作)。

 

图三(c)呈现出了三个“负”的输入数据读取速度,那是因为部分业已成功的Map任务丢失了(由于相应的实践Map职务的worker进程被kill了),供给再行履行这么些任务。相关Map任务十分的快就被重复履行了。整个运算在933秒内做到,包含了初始运行时间(只比常规实施多损耗了5%的大运)。

6、经验

我们在二零零四年1十月形成了第三个版本的MapReduce库,在二零零零年三月的本子有了显着的增强,那包蕴了输入数据本地优化、worker机器之间的动态负载均衡等等。从那未来,大家惊喜的意识,MapReduce库能广泛应用于大家平常工作中遇见的各项题材。它今后在谷歌(Google)内部各样领域获得广泛应用,包涵:

  • 常见机器学习难题
  • 谷歌(Google) News和Froogle产品的集群难点
  • 从民众查询产品(比如谷歌(Google)的Zeitgeist)的告诉中抽取数据。
  • 从大批量的新利用和新产品的网页中领到有用新闻(比如,从多量的地方搜索网页中抽取地理地点音讯)。
  • 周边的图样计算。

亚洲必赢app在哪下载 4

图四来得了在我们的源代码管理连串中,随着时间推移,独立的MapReduce程序数量的显着增添。从2004年早些时候的0个增进到2003年2月份的几近900个分化的次序。MapReduce的打响取决于选择MapReduce库可以在不到半个小时时间内写出三个简练的顺序,那几个大致的顺序能够在上千台机器的组合的集群上做大规模出现处理,那十分的大的加速了支付和本质设计的周期。此外,选用MapReduce库,能够让完全没有分布式和/或互相系统开发经历的程序员很容易的应用大批量的能源,开发出分布式和/或并行处理的利用。

亚洲必赢app在哪下载 5

在各样任务达成的时候,MapReduce库总结总括财富的利用景况。在表1,我们列出了二零零四年5月份MapReduce运行的职务所占用的相干能源。

6.① 、大规模索引

到近日结束,MapReduce最成功的施用就是重写了谷歌(Google)互联网搜索服务所使用到的index系统。索引系统的输入数据是网络爬虫抓取回来的海量的文书档案,那些文书档案数据都封存在GFS文件系统里。这个文书档案原始内容(alex注:raw
contents,作者认为正是网页中的剔除html标记后的情节、pdf和word等有格式文书档案中领到的文本内容等)
的深浅超过了20TB。索引程序是由此一多元的MapReduce操作(大致5到十二遍)来确立目录。使用MapReduce(替换上一个特地规划的、分布式处理的目录程序)带来这几个便宜:

  • 贯彻索引部分的代码简单、小巧、不难驾驭,因为对此容错、分布式以及并行计算的处理都是MapReduce库提供的。比如,使用MapReduce库,计算的代码行数从原本的3800行C++代码收缩到大体700行代码。
  • MapReduce库的品质已经丰富好了,因而我们能够把在概念上不相干的计量步骤分开处理,而不是混在一道以期收缩数额传递的附加消耗。概念上不相干的估测计算步骤的隔绝也使得大家得以很简单改变索引处理格局。比如,对在此之前的目录系统的3个小改变可能要消耗好多少个月的日子,但是在使用MapReduce的新系列上,那样的变更只供给花几天时间就能够了。
  • 目录系统的操作管理更易于了。因为由机械失效、机器处理速度缓慢、以及互联网的一念之差不通等引起的多方面题材都曾经由MapReduce库解决了,不再供给操作人士的参与了。此外,大家得以由此在目录系统集群中追加机械的简便方法升高总体处理品质。

⑦ 、相关工作

有的是种类都提供了严谨的编制程序方式,并且通过对编制程序的严酷界定来促成并行计算。例如,1个构成函数能够由此把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调度机制的贰个弱点是一旦多个义务反复失效,那么一切计算就不可能一鼓作气。大家通过忽略引起故障的记录的核心在某种程度上缓解了那一个难点。

 

MapReduce的落到实处依靠于1其中间的集群众管理理种类,这些集群众管理理体系负责在一个超大的、共享机器的集群上分布和平运动成效户职责。就算那个不是本杂谈的要紧,不过有供给提一下,这些集群众管理理种类在意见上和任何系统,如Condor[16]是一样。

 

MapReduce库的排序机制和NOW-Sort[1]的操作上很相近。读取输入源的机械(map
workers)把待排序的数额实行分区后,发送到途睿欧个Reduce
worker中的一个进展处理。每种Reduce
worker在地面对数码进行排序(尽恐怕在内部存款和储蓄器中排序)。当然,NOW-Sort没有给用户自定义的Map和Reduce函数的火候,由此不持有MapReduce库广泛的实用性。

 

River[2]提供了3个编制程序模型:处理进度经过分布式队列传送数据的方法开展交互通信。和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用于生成谷歌的互连网搜索服务所急需的多寡、用来排序、用来数量挖掘、用于机器学习,以及许多别的的体系;第二,我们兑现了一个在数千台微型计算机组成的重型集群上灵活安插运营的MapReduce。那些落成使得有效行使这个丰盛的计量能源变得万分不难,因而也顺应用来缓解谷歌遇到的其余众多必要大批量划算的标题。

 

大家也从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;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 亚洲必赢app官方下载 版权所有