《MapReduce经典例子WordCount运行详解.docx》由会员分享,可在线阅读,更多相关《MapReduce经典例子WordCount运行详解.docx(15页珍藏版)》请在课桌文档上搜索。
1、HaclpM叩RedUCe经典例子WordCount运行详解1、MaPRCdUCC理论简介1.1MaPRedUCe编程模型M叩RedUce采纳“分而治之”的思想.把对大规模数据集的操作,分发蛤个主节点背理卜的各个分节点共同完成,然后通过整合各个节点的中间结果,得刎破终结果.简洁地说,MapKwiuceM星一任务的分够及结果的汇总7在Hadwp中,用于执行MapRMcc任务的机器角色有两个;一个是JObTnlCk5另一个是TaskTrackcr.JobTrackcr是用于讽度工作的,TaskTruckcr是用于执行工作的.一个Hadwp奥群中只有一台JubTmcker.在分布式计灯中,MaPRU
2、dUCe框架负货处理了并行编程中分布式存储、工作调度、负我均ft、容错均衡、容错处理以及网络通信等困用问趟.把处理过程离度抽象为两个由数:InaP和mducemap夕发把任务分解成多个任务reduce负货杷分解后多任务处理的豺果汇总起来。於要留意的是,川M叩RCdUeC来处理的数据”式或任务必需具的这样的特点:待处理的数据蛆可以分解成我多小的数据梁,而旦每一个小数据里都可以完全并行地进行处理,102MaPRedUCe处理过程理.每个reduce产生。或1个输出,reduce的输出也是key.InputMappersMiddleResultI;11ISPliIo-ap()-5JII1M)lit2
3、二BaP()jzZlMMapReduce处理大数据集的过程Value形式的.ReducersOutputr rlv()UPartO_TT_1 rediwnO1parti在Hadoop中,每个MaPRCdlKC任务都被初始化为一个Job,每个Job乂可以分为两种阶段:nap阶段和reduce阶段.这两个阶段分别用两个函数表示,即map函数和reduceft.nap函数接收一个key,value形式的输入,然后同样产生一个(key.value)形式的中间输出,Hadoop函数接收一个Kkey.(listofvalues)影式的输入,然后对这个WdUe集合进行处2、运行WOrdCOUnt程序单诃il
4、数是域新洁也迁址能体现MaPRalgC思忸的程序之、可以称为M叩RCdUce版-HelloWorid-,该程序的完整代码可以在Hadoop安装包的-srcexailesw书目下找到.单词计数主要完胜利能是:统计一系列文本文件中每个统词出现的次数,如下图所乐.2.1打算工作现在以hadoo一般用户登录“Mcer.Hadoop”服务等.I)创建本地示例文件忏先在“hfiIe1.txtechoHelloHadoopfiIc2.txthadoooaM03tcr7$odhsdoopPMasterfile$hdoopI:传本地Iilc中文件到嶷群的inptI11IF1.hadoopillasterIhdo
5、utfiIcl.txt132012-00205:45ucrMdooo/irwut/fiIc2.txt】)在蜒群上运行WoMCount科摩的注:以i5作为输入书目,output书目作为输出书目.已燎墉洋好的WonjCcmnt的Jar在ushcdoop下面,-hndoop-cxwlcs.O.O.jmr就是,所以在下面执行吩叫时记得把路径当全U不然会提示找不到该Jar包.SH/WhadoooereirhadoDM8g6W0M16htd&oph8g3732816had8oMdooo142465216hd8pha8g2S307371216hdopMdoeo287776IZlJ1600:39hdooo-1
6、1t-1.0.0.jfg39Mgpff1QD,00:39badoooeinoe*100jf00:39ld-tcftt-1.0.6.)rw39hggnrg8-100jr徜入,2出文科克Ihadooo*VaeterJlhdooorurhadoooMdoore*oe-1.O.Ojrw%stIneUt8QQut皿2HWnrIC.fJ.rHF:t2)MapRcducc执行过H显示信息(hdoo-,Mfloter;$Kadgpjrurhdoophrcd.JobCIcnt.INhORraoredJoM11entINFOaored.UObClientllr0forcd.SbCIicnt-IMFOvaoredJ
7、obCIientINFOaredJobCliMtINFOwhored.JobCIientRunn11job.job2012022922130002IW0reduce0%ciaoS0reduce0“0100%reduce0、o100%reduce100JobOOflpIctc:job2012022922U_0002Counter,29HWoOP吩咐会启动个JVM来运行这个M叩RedMC程序.并日动获得HadOOP的配ft同时把类的路径(及其依靠关系)加入到Hadoop的阵中.以上就是HadoopJob的运行记录.从这里可以看到,这个Job被给予了一个ID号:job_2。002,而且得知输人文件有
8、两个(TOtalinputpathstoprocess:2).同时还可以了解mup的输入出记求(record数及字15数,以及reduce输入物出记录.比如说,在本例中,,固,的Usk敢垃是2个,reduce的task数录是一个,lp的舱入record数是2个,物出rcco11J数是4个等信息。2。3查看结果I)代看HDFStOUlPlrt书目内容02012-0X)206:08/urJoo0/outuV.SUCCfeSS02012-03-0206:0,/uerdooooutCMt*.locs252O12O3O206:07/user/hodoop/output/part-r-00000Ihado
9、oodNafiterhadoopf-Ieoutput卜。Und3Iteasr-r-r-1hScpuorcrupdrxr-r-hadoooSuoereroup-r-r-r-1hadoopsupergrouphadocpOMaoterJ$从上图中知道生成了三个文件.我们的结果在“Part-r-orld1IhadoOPQltaSter$3、WOrdCoUnt源码分析3.1 特殊数据类型介绍HadgP供应了如下内容的数据类型,这些数据类型都实现了WritabIeCOmparabkftl1,以便用这些类型定义的数据可以被序列化迸行附络传输和文件存储.以及进行大小比较.BooIeanWriiabIe:标准
10、布尔也数值ByicWritabk:单字15数值DixibleWfitabIe:双字H,敢FloatWritabIc1浮点StIntWritablc:整型数1.ongWritabIc:长!KW数TcxtriSMJUTFS格式存储的文本NuIIWriiabk:*l中的key或value为空时运用3.2 IB的WOrdCoUnt分析I)海代码程序packageorg.apache11o.aacle.hadc.fs.Path:importorg.apachc.hadoopio.IntWritabic:importorg.apchc.hadoop.io.1.ongWritable:importorg.a
11、puchc.hadoop.ioTextsimportorgrlorg.apacbe.had,PnKIPrvd.:importotg.aacle.hado.napd.JobClient;impo11org.apacle.hadoo.naredJobConf;importog.ap3che.hadiH.mapd.MapReduceBase:importorg.apache,hadoop.maprcd.Mappcr:importorg.apachc.hadoop.maprcd.OtputColkctor:importorg.apucbc.hdoopEaPrrdRoduCer;ImjXI)rg.叩Mb
12、C.h;XkWPJnaPfaed.RepHler;11prtorg.aMche.huliMp.mapel,TexlInpulKonnaI:Itnporio,g.apaehe.hadoop.11uwed.TexOututFcrna.publicclassWordC(nlpublicMaiicclassMapextexi.MapReduceBaM!imknmsMaerprivateHnalslaticIntWritableone=newImWriuIbk(I);privateTextword=wTcxt()tpublicvoidmapl1.ongWri(aMckey.Textvalue.()llC
13、)11eckwhxcep(mSlnngline=value.lS(11ng():StringTokcnizcrtokenizer=IKWSIringTukCniZCrOinCXwhileCtokcnizcr.hasMorcTokcns()I,ord.sci(tokcnizcr.ncx(Tokcn():output,cllcct(uxrd.one);publicKUlI沁ClaReduceeMendsMapKeduceBiiseReducer(Text,IntWritabIc.TCXljlHWriulblcImPkmtfn收Ipublicvoidreduce(Textkey.hcrauwvalu
14、es.OUlfXMCsHCelor(Tex(.IntWritaWc1outputReporterreporter)throwslOExccpn(intsum=O:while(values.hasNex)sum=valuesonext;ClHIf.m:IoUlPWKeyClily:conf.sc(RcdcrClass(ReducedInam(SumSIargsIthrows.ExcephonJobConfconf=newJgbConf:WoniCountclass);conf.sctlobNamcCwordcoiint*);CIHlfoselOutpulKeyChss(TcxUclass):co
15、nf.setOut:(conf,wPath(argsOD):(conf,newPuihargsI);Jobelient,runJobnf:首先讲解一下Job的初始化过程.mainftiHJJJobconf类来对MapRcduccJob进行初始化,然后幽用SctJobNamcO方”、介名温个JobGiJOb进行合理的命名力助于更快坳找到Job.以便在JobTracker和n*kgckc的负而中时具进行监视,JobConfconf=newJobCnfWondCounttclass)snf.seJohNaneun(三);瘦希设置JOb粕出结果key,value的中key和VakIC数据类型,因为结果
16、是单.词,个数.所以key设?!为Text”美型相当于JaViI中String类型,Value设置为Intiritable.Hl当于JaVR中的int类型,w1.M70u(ptHKeyChsN(Text.Claxs);ccnf.setOu(pulValueClassn1.seiMapptfKJassfMapclaxx);conf.SeICombinnClaM4Red匕ClaSS):conf.SeiRcducerClass(Reduce.Cias:接If就是调用JiednPuCPalN)和SetoUtPUghO设置输入输出路径.conf.setlnu(Fcrn3!:cnf.sctOutputFo
17、rmat(TcxtOutputFSpMUm“J以近UInputFornuK未设Yl-当数据传送给map时,11o会相输入分片传送到InPUIFOrni;MJnPUIFOnnal则调用方法getRecordRcadciX)I:成RccordRcadcRRcconJRcadcr再通过Crea(KCy()、crealVaIucO方法创St可供InaP处就的(key.value)对,简而方之JIiPUtFOnnatO方法是用来生成可供map处理的koy,VdlUc)对的.HadooP预定义/多种方法将不同类型的输入数据转化为11up能婚处理的对,它们都维承白InfXHFormal.分别姑:InpulH
18、irmalIIBaikyBoiueinpiouffe.BbplnputFofnui-C(HnpMbklnpFr11aICompositc!nputl7o11na(IDBInputfktnniitI-DislSuni.Machine.bs(11rlInputHmnalI一ICombineIKeyVaIueTcxtluFormaiINl-InelnpiilRwnialISequenceI一-TeraInpuiFiimiatITcxtlnputlormat其中TexUnpuiFormai是HMOoPH:认的喻人力、.TextInpuiFornut中.在籽个文件(或其一郃分)都会的独地作为map的输入
19、.而这个是维承自的。之后,每行数据都会生成一条记录.每条记录则表示成k”,VaIUe)形式:key使是每个数据的记泉在数据分片中字节偏移或数据类型是1.ongWrii.hlc;value值是何行的内容,数据类型是Tcm每一种偷入格式都有一种缭出格式及其对应.玳认的输出格式是TexiouipuiHimmf.这种圻上输入类似.会将每条记录以行的形式存入文本文件不过,它的IMiIeW以是的意形式的因为程序内容会调用String。方法将键和位转换为Sumg类型而输出.3)Map类中map方法分析publicSUHicdaSjiMapextendsMapRcdiKcBuscimplementsMappc
20、r(privateHnalMalicIntWritabIeone=newInlWnubMI);privateTextword=IKWTcxt();publicvoidnaHI.IingWriiabIekey,exlvalue,OUljXKCgHPOr(Text.111(WriabkouipwsIoEXeCp(kmS11ngline=VmlXMOSIrlng();SinngTokenizertokeniziMwStringTokenizef(Iii)C):while(IokenizerJkasMoreTokeiks()Iv,ord.el(l.,此接口是一个规数类叁,它有4种形式的参数.分别用来指
21、定map的输入key值类型、输入value值类型、输出key鱼类型和输出位类型在本例中,因为运用的足TeXllnpuiFongi.它的输出key(ft1.ottgWritable类型.输出valueIf(JiText类型,所以nu的苗入类型为在本例中须要输出“ord,l这样的形式,因此出的key值类型是TC立於出的、皿值类型是IntWritabieo实现此技口类还须要实现map方法,11wp方法会具体负溃对询入进行操作,在本例中,map方法对输入的行以空格为单但进行切分,然后运用OulpulCoIIcct收集输出的.4)Reduce类中reduce方法分析publicstaticclassRe
22、duceextendsMapRcduccBascimplementsReducerTex(.ImWriubk.Text.ImWriiabIopublicvalues.OuipuiCoIIecKH(exc.IniWriUb100uu.Reporterreporter)throwsIOExcepHnintsum=O;while(values.hasNex()(umvalues.,next).get():output.coHcci(kcy.newIntWritablc(sum):)JReduce之也之,KIIMupReduceBaM:的.须要实现RMUeCr接C1.Reduce类以map的绘出作为输
23、入,因此Reduce的粕入类型是(TmHImriiHbk),而Reduce的输出型单词和它的数目,因此,它的雏出类型是Sexi,InIWritable)Reduce类也要实现reduce方法,在此方法中,reduce函数将椅入的key值作为输出的keyffi,然后将获得多个ValuC旗加起来,作为输出的值.3.3新的WOrdCOUnt分析I)源代码程序packageorg.apachc.hadoop.cxampks:11prlpva.r.IOHxceplion:ntp(lpva.ulil.SIringTiMeni/。:importog.aale.h3dIntWritabk:importorg.
24、apucbc.hadoopText;importorgajwchchap,mceJob;IInP(1u里ipacbehal(M)p.maprvduce.Mappcn11p(rlorg.apucl.hadiHp.naprvhc:.Reducer;importorg.aacle.hadoop.mapce.lib.input.;Itnporio,g.ap3che.hadoop.nuMeduce.lib.ou(put.:importorg.apache,hadoop。u(il.GencricOpionsParcr:publicclassWordCount(publicstalkclassTokcniz
25、crMappcrextendsMappcKObjcct.TCX1.TCX1.lntWritab!c11vatefinalstaticIntWritableoeeu,lnWitable(I):privateTcxcword=newText):publicvoidmap(Objectkey.Textva1ucContextcocx()throwsIOExccption.IiKemiptcdExccptionStringTokcnizcritr=newStringTokcni/crtvaluc.toStringO);while(itr,hasMorcTokcns()WOR1.ScMitrmcxfTo
26、kcn();contextWrhC(WWdone);)publicstaticclassIniSumRcduccrextendsRJuccrTcxt.ImWritabIc.TcxtlIntWritabIc)IOtivateIntWritablewultnewIinWriubkO:publicvoidreduce(Textkey.Itcniblc(IntWriuiblOvalues.Contextcomcx()throwsIOExcqxion.IntcnuptedExcqxtion(inisum三O;for(IntWritabIcval:values)(sum=val.ge();)IVAUkM!
27、(SUn):context,writc(kcy.result);)publicstackvoidmainStringargs)throwsExccpcionCn11gurali(nconf=newContlgurali(n;Siring1IilhcrArgs=newGencrkOp(三)nParcrXconf.arg),gelKemainngrgs():if(OiherArgsJengih!2)(Sysienieir.rintlM*Usage:wordcoun(out)*:System.cxit;)JobjobnewJob(conf.wordcoun):job-Se1.hlByCIaSS(Wo
28、rdCoun1.claw):job.sctMappcrClass(TokcnizcrMappcr.class):job,SciCombincrClasMIniSumRcdiKer.class):)oboSctReducciCIass(IntSumRcdiKcr.class);job.scO(putKcyClasMTcx(.class)job.setOulpuiValueClassewPaihMap过程publicstalk:classTokenizerMapixirCxtcndsMappcr(Object.TcxhText.InlWriiabkJ(privatefinalstaticIntWr
29、itabIco=newIntWritablc(:privateTextword=newTcxUpublicvoidmap:context.*itc(WOnj,one)jMUP过程很要继承OrgOapuchc.hdoop.maprcduce包中Mapper类,并网写其map方法。通过在map方法中淞加两句把key假和value假输出到限刷台的代码,可以发觉map方法中VMW侦存储的是文本文件中的一行(以同车符为行结束标记),而key侦为该行的首字母相对于文本文件的甘地坟的假移ht,墙后SlringTokenizer类将每一行拆分成为一个个的单词,并将Cord.D作为map方法的结果输出.其余的I
30、:作都交有ViiPRedUS框架处理.2Reduce过程publicstalk:classI!MSuinRechicerextendsRcduccr(private1ntWri(ublcresult=newInlWriuibW):publicvoklreduce(TCXlkey,IlerabIecImWnfabIovalues.ContextCOnIBXl)throwsIOExcqMion.IntcnuptcdExccptioninisum=0;forImWriiabIeval三values)sumval.geIhruwsException(ConGgurationconfne%vConGgu
31、ration):StringOiherArgswwGenekO)sPare(conf.args.).getRemainingAxgM):if(othcrArgstlength!=2)SyMcm.err.prinln(Usage:wordcout;)ob.seiJurByClass(WofdCount.class):b.seMitpperChkeizerMaper.ckss)job、XclCombinerCIasslnl$umRe(lucer.clasx);job.seReducefClaMIniSumRedueer.class):job.scOutChss(Text,class):job.se
32、tOtputValcClassHntWritabic.class):(job.newPath(OhcrArgM0):(job.newPath(othcrArgs1);SyMenuexi(0obwaitFixCompkliim?0:I);在MapReduce.由JOb对软负或管理和运行个计灯任务.并通过Job的些方法对任务的参数进行相关的设巴.此处设置广达川TOkenl比小打冲日完成Map过程中的处理和xiJllIniSumRcduccr完成Combine和Reduce过程中的处理iiS9(Map过程和Reduce过样的输出类型,key的类型为TCXtvalue的类型为ImWriIabk,任务的
33、输出和输入路径则由吩咐行卷数指定,井由他分别设定.完成相应任务的警数设定后,即可漏用JnhMaiH*KR11k出刈),川、执行仃&4、WOrdCoUnt处理过程本15将对WorlICounl进行更JI体的讲解.孔体执行步骤如卜;11构文件拆分成splits.由于测试用的文件较小.所以每个文件为一个split.并将文件按行分则形成(key,valuc对,如图4-1所示,这一步由MaPRahICe他架向功完成,具中偏移呆(即keyW包括/1可车所占的字符数(*inds和1.inUX环境至不同).愉人数据HelloWorldBycWorld分豺结果图4-1分割过程2)将分别好的kcy.valuc)时交给用户定义的map方法进行处理,生成新的key,value对,如图42所示。分别结果g方法怆出(12.“BygWorld13.