大數(shù)據(jù)技術(shù)原理與應(yīng)用(第3版)-第7章-MapReduce_第1頁(yè)
大數(shù)據(jù)技術(shù)原理與應(yīng)用(第3版)-第7章-MapReduce_第2頁(yè)
大數(shù)據(jù)技術(shù)原理與應(yīng)用(第3版)-第7章-MapReduce_第3頁(yè)
大數(shù)據(jù)技術(shù)原理與應(yīng)用(第3版)-第7章-MapReduce_第4頁(yè)
大數(shù)據(jù)技術(shù)原理與應(yīng)用(第3版)-第7章-MapReduce_第5頁(yè)
已閱讀5頁(yè),還剩68頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

廈門(mén)大學(xué)計(jì)算機(jī)科學(xué)系2020年版本

第7章MapReduce

提綱7.1 概述7.2MapReduce體系結(jié)構(gòu)7.3 MapReduce工作流程7.4 實(shí)例分析:WordCount7.5 MapReduce的具體應(yīng)用7.6 MapReduce編程實(shí)踐本PPT是如下教材的配套講義:《大數(shù)據(jù)技術(shù)原理與應(yīng)用——概念、存儲(chǔ)、處理、分析與應(yīng)用》7.1 概述7.1.1 分布式并行編程7.1.2 MapReduce模型簡(jiǎn)介7.1.3 Map和Reduce函數(shù)7.1.1 分布式并行編程“摩爾定律”,CPU性能大約每隔18個(gè)月翻一番從2005年開(kāi)始摩爾定律逐漸失效,需要處理的數(shù)據(jù)量快速增加,人們開(kāi)始借助于分布式并行編程來(lái)提高程序性能分布式程序運(yùn)行在大規(guī)模計(jì)算機(jī)集群上,可以并行執(zhí)行大規(guī)模數(shù)據(jù)處理任務(wù),從而獲得海量的計(jì)算能力谷歌公司最先提出了分布式并行編程模型MapReduce,HadoopMapReduce是它的開(kāi)源實(shí)現(xiàn),后者比前者使用門(mén)檻低很多7.1.1 分布式并行編程問(wèn)題:在MapReduce出現(xiàn)之前,已經(jīng)有像MPI這樣非常成熟的并行計(jì)算框架了,那么為什么Google還需要MapReduce?MapReduce相較于傳統(tǒng)的并行計(jì)算框架有什么優(yōu)勢(shì)?傳統(tǒng)并行計(jì)算框架MapReduce集群架構(gòu)/容錯(cuò)性共享式(共享內(nèi)存/共享存儲(chǔ)),容錯(cuò)性差非共享式,容錯(cuò)性好硬件/價(jià)格/擴(kuò)展性刀片服務(wù)器、高速網(wǎng)、SAN,價(jià)格貴,擴(kuò)展性差普通PC機(jī),便宜,擴(kuò)展性好編程/學(xué)習(xí)難度what-how,難what,簡(jiǎn)單適用場(chǎng)景實(shí)時(shí)、細(xì)粒度計(jì)算、計(jì)算密集型批處理、非實(shí)時(shí)、數(shù)據(jù)密集型7.1.2 MapReduce模型簡(jiǎn)介MapReduce將復(fù)雜的、運(yùn)行于大規(guī)模集群上的并行計(jì)算過(guò)程高度地抽象到了兩個(gè)函數(shù):Map和Reduce編程容易,不需要掌握分布式并行編程細(xì)節(jié),也可以很容易把自己的程序運(yùn)行在分布式系統(tǒng)上,完成海量數(shù)據(jù)的計(jì)算MapReduce采用“分而治之”策略,一個(gè)存儲(chǔ)在分布式文件系統(tǒng)中的大規(guī)模數(shù)據(jù)集,會(huì)被切分成許多獨(dú)立的分片(split),這些分片可以被多個(gè)Map任務(wù)并行處理MapReduce設(shè)計(jì)的一個(gè)理念就是“計(jì)算向數(shù)據(jù)靠攏”,而不是“數(shù)據(jù)向計(jì)算靠攏”,因?yàn)?,移?dòng)數(shù)據(jù)需要大量的網(wǎng)絡(luò)傳輸開(kāi)銷(xiāo)MapReduce框架采用了Master/Slave架構(gòu),包括一個(gè)Master和若干個(gè)Slave。Master上運(yùn)行JobTracker,Slave上運(yùn)行TaskTracker

Hadoop框架是用Java實(shí)現(xiàn)的,但是,MapReduce應(yīng)用程序則不一定要用Java來(lái)寫(xiě)

7.1.3 Map和Reduce函數(shù)函數(shù)輸入輸出說(shuō)明Map<k1,v1>如:<行號(hào),”abc”>List(<k2,v2>)如:<“a”,1><“b”,1><“c”,1>1.將小數(shù)據(jù)集進(jìn)一步解析成一批<key,value>對(duì),輸入Map函數(shù)中進(jìn)行處理2.每一個(gè)輸入的<k1,v1>會(huì)輸出一批<k2,v2>。<k2,v2>是計(jì)算的中間結(jié)果Reduce<k2,List(v2)>如:<“a”,<1,1,1>><k3,v3><“a”,3>輸入的中間結(jié)果<k2,List(v2)>中的List(v2)表示是一批屬于同一個(gè)k2的value表7-1Map和Reduce7.2MapReduce的體系結(jié)構(gòu)MapReduce體系結(jié)構(gòu)主要由四個(gè)部分組成,分別是:Client、JobTracker、TaskTracker以及Task7.2MapReduce的體系結(jié)構(gòu)MapReduce主要有以下4個(gè)部分組成:1)Client用戶編寫(xiě)的MapReduce程序通過(guò)Client提交到JobTracker端用戶可通過(guò)Client提供的一些接口查看作業(yè)運(yùn)行狀態(tài)2)JobTrackerJobTracker負(fù)責(zé)資源監(jiān)控和作業(yè)調(diào)度JobTracker監(jiān)控所有TaskTracker與Job的健康狀況,一旦發(fā)現(xiàn)失敗,就將相應(yīng)的任務(wù)轉(zhuǎn)移到其他節(jié)點(diǎn)JobTracker會(huì)跟蹤任務(wù)的執(zhí)行進(jìn)度、資源使用量等信息,并將這些信息告訴任務(wù)調(diào)度器(TaskScheduler),而調(diào)度器會(huì)在資源出現(xiàn)空閑時(shí),選擇合適的任務(wù)去使用這些資源7.2MapReduce的體系結(jié)構(gòu)3)TaskTrackerTaskTracker會(huì)周期性地通過(guò)“心跳”將本節(jié)點(diǎn)上資源的使用情況和任務(wù)的運(yùn)行進(jìn)度匯報(bào)給JobTracker,同時(shí)接收J(rèn)obTracker發(fā)送過(guò)來(lái)的命令并執(zhí)行相應(yīng)的操作(如啟動(dòng)新任務(wù)、殺死任務(wù)等)TaskTracker使用“slot”等量劃分本節(jié)點(diǎn)上的資源量(CPU、內(nèi)存等)。一個(gè)Task獲取到一個(gè)slot后才有機(jī)會(huì)運(yùn)行,而Hadoop調(diào)度器的作用就是將各個(gè)TaskTracker上的空閑slot分配給Task使用。slot分為Mapslot和Reduceslot兩種,分別供MapTask和ReduceTask使用4)TaskTask分為MapTask和ReduceTask兩種,均由TaskTracker啟動(dòng)7.3 MapReduce工作流程7.3.1 工作流程概述7.3.2 MapReduce各個(gè)執(zhí)行階段7.3.3 Shuffle過(guò)程詳解7.3.1 工作流程概述圖7-1MapReduce工作流程Shuffle不同的Map任務(wù)之間不會(huì)進(jìn)行通信不同的Reduce任務(wù)之間也不會(huì)發(fā)生任何信息交換用戶不能顯式地從一臺(tái)機(jī)器向另一臺(tái)機(jī)器發(fā)送消息所有的數(shù)據(jù)交換都是通過(guò)MapReduce框架自身去實(shí)現(xiàn)的7.3.2 MapReduce各個(gè)執(zhí)行階段7.3.2 MapReduce各個(gè)執(zhí)行階段HDFS以固定大小的block為基本單位存儲(chǔ)數(shù)據(jù),而對(duì)于MapReduce而言,其處理單位是split。split是一個(gè)邏輯概念,它只包含一些元數(shù)據(jù)信息,比如數(shù)據(jù)起始位置、數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)所在節(jié)點(diǎn)等。它的劃分方法完全由用戶自己決定。關(guān)于Split(分片)7.3.2 MapReduce各個(gè)執(zhí)行階段Reduce任務(wù)的數(shù)量最優(yōu)的Reduce任務(wù)個(gè)數(shù)取決于集群中可用的reduce任務(wù)槽(slot)的數(shù)目通常設(shè)置比reduce任務(wù)槽數(shù)目稍微小一些的Reduce任務(wù)個(gè)數(shù)(這樣可以預(yù)留一些系統(tǒng)資源處理可能發(fā)生的錯(cuò)誤)Map任務(wù)的數(shù)量Hadoop為每個(gè)split創(chuàng)建一個(gè)Map任務(wù),split的多少?zèng)Q定了Map任務(wù)的數(shù)目。大多數(shù)情況下,理想的分片大小是一個(gè)HDFS塊7.3.3 Shuffle過(guò)程詳解圖7-3Shuffle過(guò)程

1.Shuffle過(guò)程簡(jiǎn)介7.3.3 Shuffle過(guò)程詳解2.Map端的Shuffle過(guò)程每個(gè)Map任務(wù)分配一個(gè)緩存MapReduce默認(rèn)100MB緩存設(shè)置溢寫(xiě)比例0.8分區(qū)默認(rèn)采用哈希函數(shù)排序是默認(rèn)的操作排序后可以合并(Combine)合并不能改變最終結(jié)果在Map任務(wù)全部結(jié)束之前進(jìn)行歸并歸并得到一個(gè)大的文件,放在本地磁盤(pán)文件歸并時(shí),如果溢寫(xiě)文件數(shù)量大于預(yù)定值(默認(rèn)是3)則可以再次啟動(dòng)Combiner,少于3不需要JobTracker會(huì)一直監(jiān)測(cè)Map任務(wù)的執(zhí)行,并通知Reduce任務(wù)來(lái)領(lǐng)取數(shù)據(jù)合并(Combine)和歸并(Merge)的區(qū)別:兩個(gè)鍵值對(duì)<“a”,1>和<“a”,1>,如果合并,會(huì)得到<“a”,2>,如果歸并,會(huì)得到<“a”,<1,1>>7.3.3 Shuffle過(guò)程詳解3.Reduce端的Shuffle過(guò)程圖7-5Reduce端的Shuffle過(guò)程Reduce任務(wù)通過(guò)RPC向JobTracker詢(xún)問(wèn)Map任務(wù)是否已經(jīng)完成,若完成,則領(lǐng)取數(shù)據(jù)Reduce領(lǐng)取數(shù)據(jù)先放入緩存,來(lái)自不同Map機(jī)器,先歸并,再合并,寫(xiě)入磁盤(pán)多個(gè)溢寫(xiě)文件歸并成一個(gè)或多個(gè)大文件,文件中的鍵值對(duì)是排序的當(dāng)數(shù)據(jù)很少時(shí),不需要溢寫(xiě)到磁盤(pán),直接在緩存中歸并,然后輸出給Reduce7.3.4 MapReduce應(yīng)用程序執(zhí)行過(guò)程7.4 實(shí)例分析:WordCount7.4.1 WordCount程序任務(wù)7.4.2 WordCount設(shè)計(jì)思路7.4.3 一個(gè)WordCount執(zhí)行過(guò)程的實(shí)例7.4.1 WordCount程序任務(wù)表7-2WordCount程序任務(wù)程序WordCount輸入一個(gè)包含大量單詞的文本文件輸出文件中每個(gè)單詞及其出現(xiàn)次數(shù)(頻數(shù)),并按照單詞字母順序排序,每個(gè)單詞和其頻數(shù)占一行,單詞和頻數(shù)之間有間隔表7-3一個(gè)WordCount的輸入和輸出實(shí)例輸入輸出HelloWorldHelloHadoopHelloMapReduceHadoop1Hello3MapReduce1World17.4.2 WordCount設(shè)計(jì)思路首先,需要檢查WordCount程序任務(wù)是否可以采用MapReduce來(lái)實(shí)現(xiàn)其次,確定MapReduce程序的設(shè)計(jì)思路最后,確定MapReduce程序的執(zhí)行過(guò)程7.4.3 一個(gè)WordCount執(zhí)行過(guò)程的實(shí)例圖7-7Map過(guò)程示意圖7.4.3 一個(gè)WordCount執(zhí)行過(guò)程的實(shí)例圖7-8用戶沒(méi)有定義Combiner時(shí)的Reduce過(guò)程示意圖7.4.3 一個(gè)WordCount執(zhí)行過(guò)程的實(shí)例圖7-9用戶有定義Combiner時(shí)的Reduce過(guò)程示意圖7.5MapReduce的具體應(yīng)用MapReduce可以很好地應(yīng)用于各種計(jì)算問(wèn)題關(guān)系代數(shù)運(yùn)算(選擇、投影、并、交、差、連接)分組與聚合運(yùn)算矩陣-向量乘法矩陣乘法7.5MapReduce的具體應(yīng)用假設(shè)有關(guān)系R(A,B)和S(B,C),對(duì)二者進(jìn)行自然連接操作使用Map過(guò)程,把來(lái)自R的每個(gè)元組<a,b>轉(zhuǎn)換成一個(gè)鍵值對(duì)<b,<R,a>>,其中的鍵就是屬性B的值。把關(guān)系R包含到值中,這樣做使得我們可以在Reduce階段,只把那些來(lái)自R的元組和來(lái)自S的元組進(jìn)行匹配。類(lèi)似地,使用Map過(guò)程,把來(lái)自S的每個(gè)元組<b,c>,轉(zhuǎn)換成一個(gè)鍵值對(duì)<b,<S,c>>所有具有相同B值的元組被發(fā)送到同一個(gè)Reduce進(jìn)程中,Reduce進(jìn)程的任務(wù)是,把來(lái)自關(guān)系R和S的、具有相同屬性B值的元組進(jìn)行合并Reduce進(jìn)程的輸出則是連接后的元組<a,b,c>,輸出被寫(xiě)到一個(gè)單獨(dú)的輸出文件中用MapReduce實(shí)現(xiàn)關(guān)系的自然連接7.5MapReduce的具體應(yīng)用用MapReduce實(shí)現(xiàn)關(guān)系的自然連接7.6 MapReduce編程實(shí)踐7.6.1 任務(wù)要求7.6.2 編寫(xiě)Map處理邏輯7.6.3 編寫(xiě)Reduce處理邏輯7.6.4 編寫(xiě)main方法7.6.5 編譯打包代碼以及運(yùn)行程序詳細(xì)編程實(shí)踐指南請(qǐng)參考廈門(mén)大學(xué)數(shù)據(jù)庫(kù)實(shí)驗(yàn)室建設(shè)的高校大數(shù)據(jù)課程公共服務(wù)平臺(tái)的技術(shù)文章:《大數(shù)據(jù)原理與應(yīng)用(第3版)第7章MapReduce學(xué)習(xí)指南》,訪問(wèn)地址:/blog/2481-2/7.6.1任務(wù)要求文件A的內(nèi)容如下:ChinaismymotherlandIloveChina文件B的內(nèi)容如下:IamfromChina期望結(jié)果如右側(cè)所示:I2is1China3my1love1am1from1motherland17.6.2編寫(xiě)Map處理邏輯Map輸入類(lèi)型為<key,value>期望的Map輸出類(lèi)型為<單詞,出現(xiàn)次數(shù)>Map輸入類(lèi)型最終確定為<Object,Text>Map輸出類(lèi)型最終確定為<Text,IntWritable>publicstaticclassMyMapperextendsMapper<Object,Text,Text,IntWritable>{ privatefinalstaticIntWritableone=newIntWritable(1); privateTextword=newText(); publicvoidmap(Objectkey,Textvalue,Contextcontext)throwsIOException,InterruptedException{

StringTokenizer

itr=newStringTokenizer(value.toString()); while(itr.hasMoreTokens()) {

word.set(itr.nextToken());

context.write(word,one); } }}

7.6.3編寫(xiě)Reduce處理邏輯在Reduce處理數(shù)據(jù)之前,Map的結(jié)果首先通過(guò)Shuffle階段進(jìn)行整理Reduce階段的任務(wù):對(duì)輸入數(shù)字序列進(jìn)行求和Reduce的輸入數(shù)據(jù)為<key,Iterable容器>Reduce任務(wù)的輸入數(shù)據(jù):<”I”,<1,1>><”is”,1>……<”from”,1><”China”,<1,1,1>>

publicstaticclassMyReducerextendsReducer<Text,IntWritable,Text,IntWritable>{ privateIntWritableresult=newIntWritable(); publicvoidreduce(Textkey,Iterable<IntWritable>values,Contextcontext)throwsIOException,InterruptedException{ intsum=0; for(IntWritableval:values) { sum+=val.get(); } result.set(sum); context.write(key,result); }}

7.6.3編寫(xiě)Reduce處理邏輯7.6.4編寫(xiě)main方法publicstaticvoidmain(String[]args)throwsException{Configurationconf=newConfiguration();//程序運(yùn)行時(shí)參數(shù)

String[]otherArgs=newGenericOptionsParser(conf,args).getRemainingArgs();if(otherArgs.length!=2){System.err.println("Usage:wordcount<in><out>");

System.exit(2);}Jobjob=newJob(conf,"wordcount");//設(shè)置環(huán)境參數(shù)

job.setJarByClass(WordCount.class);//設(shè)置整個(gè)程序的類(lèi)名

job.setMapperClass(MyMapper.class);//添加MyMapper類(lèi)

job.setReducerClass(MyReducer.class);//添加MyReducer類(lèi)

job.setOutputKeyClass(Text.class);//設(shè)置輸出類(lèi)型

job.setOutputValueClass(IntWritable.class);//設(shè)置輸出類(lèi)型

FileInputFormat.addInputPath(job,newPath(otherArgs[0]));//設(shè)置輸入文件

FileOutputFormat.setOutputPath(job,newPath(otherArgs[1]));//設(shè)置輸出文件

System.exit(job.waitForCompletion(true)?0:1);}importjava.io.IOException;importjava.util.StringTokenizer;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.Mapper;importorg.apache.hadoop.mapreduce.Reducer;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;importorg.apache.hadoop.util.GenericOptionsParser;publicclassWordCount{//WordCount類(lèi)的具體代碼見(jiàn)下一頁(yè)}完整代碼

publicclassWordCount{ publicstaticclassMyMapperextendsMapper<Object,Text,Text,IntWritable>{ privatefinalstaticIntWritableone=newIntWritable(1); privateTextword=newText(); publicvoidmap(Objectkey,Textvalue,Contextcontext)throwsIOException,InterruptedException{ StringTokenizeritr=newStringTokenizer(value.toString()); while(itr.hasMoreTokens()){ word.set(itr.nextToken()); context.write(word,one); } } } publicstaticclassMyReducerextendsReducer<Text,IntWritable,Text,IntWritable>{ privateIntWritableresult=newIntWritable(); publicvoidreduce(Textkey,Iterable<IntWritable>values,Contextcontext)throwsIOException,InterruptedException{ intsum=0; for(IntWritableval:values) { sum+=val.get(); } result.set(sum); context.write(key,result); } } publicstaticvoidmain(String[]args)throwsException{ Configurationconf=newConfiguration(); String[]otherArgs=newGenericOptionsParser(conf,args).getRemainingArgs(); if(otherArgs.length!=2) { System.err.println("Usage:wordcount<in><out>"); System.exit(2); } Jobjob=newJob(conf,"wordcount"); job.setJarByClass(WordCount.class); job.setMapperClass(MyMapper.class); job.setReducerClass(MyReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job,newPath(otherArgs[0])); FileOutputFormat.setOutputPath(job,newPath(otherArgs[1])); System.exit(job.waitForCompletion(true)?0:1); }}7.6.5編譯打包代碼以及運(yùn)行程序?qū)嶒?yàn)步驟:使用java編譯程序,生成.class文件將.class文件打包為jar包運(yùn)行jar包(需要啟動(dòng)Hadoop)查看結(jié)果7.6.5編譯打包代碼以及運(yùn)行程序Hadoop3.1.3版本中的依賴(lài)jar使用Hadoop3.1.3

運(yùn)行WordCount實(shí)例至少需要如下三個(gè)jar:$HADOOP_HOME/share/hadoop/common/hadoop-common-3.1.3.jar$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.1.3.jar$HADOOP_HOME/share/hadoop/common/lib/commons-cli-1.2.jar通過(guò)命令

hadoopclasspath

可以得到運(yùn)行Hadoop程序所需的全部classpath信息7.6.5編譯打包代碼以及運(yùn)行程序?qū)adoop的classhpath信息添加到CLASSPATH變量中,在~/.bashrc中增加如下幾行:exportHADOOP_HOME=/usr/local/hadoopexportCLASSPATH=$($HADOOP_HOME/bin/hadoopclasspath):$CLASSPATH

執(zhí)行

source~/.bashrc

使變量生效,接著就可以通過(guò)

javac

命令編譯WordCount.java接著把.class文件打包成jar,才能在Hadoop中運(yùn)行:運(yùn)行程序:7.6.5編譯打包代碼以及運(yùn)行程序如何使用Eclipse編譯運(yùn)行MapReduce程序?詳細(xì)編程實(shí)踐指南請(qǐng)參考廈門(mén)大學(xué)數(shù)據(jù)庫(kù)實(shí)驗(yàn)室建設(shè)的高校大數(shù)據(jù)課程公共服務(wù)平臺(tái)的技術(shù)文章:《大數(shù)據(jù)原理與應(yīng)用(第3版)第7章MapReduce學(xué)習(xí)指南》,訪問(wèn)地址:/blog/2481-2/7.6.5編譯打包代碼以及運(yùn)行程序首先,啟動(dòng)Eclipse,啟動(dòng)以后會(huì)彈出如下圖所示界面,提示設(shè)置工作空間(workspace)。1、在Eclipse中創(chuàng)建項(xiàng)目7.6.5編譯打包代碼以及運(yùn)行程序可以直接采用默認(rèn)的設(shè)置“/home/hadoop/workspace”,點(diǎn)擊“OK”按鈕??梢钥闯觯捎诋?dāng)前是采用hadoop用戶登錄了Linux系統(tǒng),因此,默認(rèn)的工作空間目錄位于hadoop用戶目錄“/home/hadoop”下。

Eclipse啟動(dòng)以后,呈現(xiàn)的界面如下圖所示。7.6.5編譯打包代碼以及運(yùn)行程序選擇“File–>New–>JavaProject”菜單,開(kāi)始創(chuàng)建一個(gè)Java工程,彈出如下圖所示界面。7.6.5編譯打包代碼以及運(yùn)行程序在“Projectname”后面輸入工程名稱(chēng)“WordCount”,選中“Usedefaultlocation”,讓這個(gè)Java工程的所有文件都保存到“/home/hadoop/workspace/WordCount”目錄下。在“JRE”這個(gè)選項(xiàng)卡中,可以選擇當(dāng)前的Linux系統(tǒng)中已經(jīng)安裝好的JDK,比如jdk1.8.0_162。然后,點(diǎn)擊界面底部的“Next>”按鈕,進(jìn)入下一步的設(shè)置。7.6.5編譯打包代碼以及運(yùn)行程序2.為項(xiàng)目添加需要用到的JAR包進(jìn)入下一步的設(shè)置以后,會(huì)彈出如下圖所示界面。7.6.5編譯打包代碼以及運(yùn)行程序需要在這個(gè)界面中加載該Java工程所需要用到的JAR包,這些JAR包中包含了與Hadoop相關(guān)的JavaAPI。這些JAR包都位于Linux系統(tǒng)的Hadoop安裝目錄下,對(duì)于本教程而言,就是在“/usr/local/hadoop/share/hadoop”目錄下。點(diǎn)擊界面中的“Libraries”選項(xiàng)卡,然后,點(diǎn)擊界面右側(cè)的“AddExternalJARs…”按鈕,彈出如下圖所示界面。7.6.5編譯打包代碼以及運(yùn)行程序在該界面中,上面有一排目錄按鈕(即“usr”、“l(fā)ocal”、“hadoop”、“share”、“hadoop”、“mapreduce”和“l(fā)ib”),當(dāng)點(diǎn)擊某個(gè)目錄按鈕時(shí),就會(huì)在下面列出該目錄的內(nèi)容。

為了編寫(xiě)一個(gè)MapReduce程序,一般需要向Java工程中添加以下JAR包:

(1)“/usr/local/hadoop/share/hadoop/common”目錄下的hadoop-common-3.1.3.jar和haoop-nfs-3.1.3.jar;

(2)“/usr/local/hadoop/share/hadoop/common/lib”目錄下的所有JAR包;

(3)“/usr/local/hadoop/share/hadoop/mapreduce”目錄下的所有JAR包,但是,不包括jdiff、lib、lib-examples和sources目錄,具體如下圖所示。7.6.5編譯打包代碼以及運(yùn)行程序(4)“/usr/local/hadoop/share/hadoop/mapreduce/lib”目錄下的所有JAR包。

比如,如果要把“/usr/local/hadoop/share/hadoop/common”目錄下的hadoop-common-3.1.3.jar和haoop-nfs-3.1.3.jar添加到當(dāng)前的Java工程中,可以在界面中點(diǎn)擊相應(yīng)的目錄按鈕,進(jìn)入到common目錄,然后,界面會(huì)顯示出common目錄下的所有內(nèi)容(如下圖所示)。7.6.5編譯打包代碼以及運(yùn)行程序請(qǐng)?jiān)诮缑嬷杏檬髽?biāo)點(diǎn)擊選中hadoop-common-3.1.3.jar和haoop-nfs-3.1.3.jar,然后點(diǎn)擊界面右下角的“確定”按鈕,就可以把這兩個(gè)JAR包增加到當(dāng)前Java工程中,出現(xiàn)的界面如下圖所示。7.6.5編譯打包代碼以及運(yùn)行程序從這個(gè)界面中可以看出,hadoop-common-3.1.3.jar和haoop-nfs-3.1.3.jar已經(jīng)被添加到當(dāng)前Java工程中。然后,按照類(lèi)似的操作方法,可以再次點(diǎn)擊“AddExternalJARs…”按鈕,把剩余的其他JAR包都添加進(jìn)來(lái)。需要注意的是,當(dāng)需要選中某個(gè)目錄下的所有JAR包時(shí),可以使用“Ctrl+A”組合鍵進(jìn)行全選操作。全部添加完畢以后,就可以點(diǎn)擊界面右下角的“Finish”按鈕,完成Java工程WordCount的創(chuàng)建。7.6.5編譯打包代碼以及運(yùn)行程序3、編寫(xiě)Java應(yīng)用程序下面編寫(xiě)一個(gè)Java應(yīng)用程序,即WordCount.java。請(qǐng)?jiān)贓clipse工作界面左側(cè)的“PackageExplorer”面板中(如下圖所示),找到剛才創(chuàng)建好的工程名稱(chēng)“WordCount”,然后在該工程名稱(chēng)上點(diǎn)擊鼠標(biāo)右鍵,在彈出的菜單中選擇“New–>Class”菜單。7.6.5編譯打包代碼以及運(yùn)行程序選擇“New–>Class”菜單以后會(huì)出現(xiàn)如下圖所示界面。7.6.5編譯打包代碼以及運(yùn)行程序在該界面中,只需要在“Name”后面輸入新建的Java類(lèi)文件的名稱(chēng),這里采用名稱(chēng)“WordCount”,其他都可以采用默認(rèn)設(shè)置,然后,點(diǎn)擊界面右下角“Finish”按鈕,出現(xiàn)如下圖所示界面。7.6.5編譯打包代碼以及運(yùn)行程序可以看出,Eclipse自動(dòng)創(chuàng)建了一個(gè)名為“WordCount.java”的源代碼文件,并且包含了代碼“publicclassWordCount{}”,請(qǐng)清空該文件里面的代碼,然后在該文件中輸入完整的詞頻統(tǒng)計(jì)程序代碼,具體如下:importjava.io.IOException;importjava.util.Iterator;importjava.util.StringTokenizer;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.Path;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Job;importorg.apache.hadoop.mapreduce.Mapper;importorg.apache.hadoop.mapreduce.Reducer;importorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;importorg.apache.hadoop.util.GenericOptionsParser;publicclassWordCount{publicWordCount(){}publicstaticvoidmain(String[]args)throwsException{Configurationconf=newConfiguration();String[]otherArgs=(newGenericOptionsParser(conf,args)).getRemainingArgs();if(otherArgs.length<2){

System.err.println("Usage:wordcount<in>[<in>...]<out>");

System.exit(2);}Jobjob=Job.getInstance(conf,"wordcount");

job.setJarByClass(WordCount.class);

job.setMapperClass(WordCount.TokenizerMapper.class);

job.setCombinerClass(WordCount.IntSumReducer.class);

job.setReducerClass(WordCount.IntSumReducer.class);

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(IntWritable.class);for(int

i=0;i<otherArgs.length-1;++i){

FileInputFormat.addInputPath(job,newPath(otherArgs[i]));}7.6.5編譯打包代碼以及運(yùn)行程序FileOutputFormat.setOutputPath(job,newPath(otherArgs[otherArgs.length-1]));

System.exit(job.waitForCompletion(true)?0:1);}publicstaticclassTokenizerMapperextendsMapper<Object,Text,Text,IntWritable>{privatestaticfinalIntWritableone=newIntWritable(1);privateTextword=newText();publicTokenizerMapper(){}publicvoidmap(Objectkey,Textvalue,Mapper<Object,Text,Text,IntWritable>.Contextcontext)throwsIOException,InterruptedException{

StringTokenizer

itr=newStringTokenizer(value.toString());while(itr.hasMoreTokens()){

this.word.set(itr.nextToken());

context.write(this.word,one);}}}publicstaticclassIntSumReducerextendsReducer<Text,IntWritable,Text,IntWritable>{privateIntWritableresult=newIntWritable();publicIntSumReducer(){}publicvoidreduce(Textkey,Iterable<IntWritable>values,Reducer<Text,IntWritable,Text,IntWritable>.Contextcontext)throwsIOException,InterruptedException{

intsum=0;

IntWritable

val;for(Iterator

i$=values.iterator();i$.hasNext();sum+=val.get()){

val=(IntWritable)i$.next();}

this.result.set(sum);

context.write(key,this.result);}}}7.6.5編譯打包代碼以及運(yùn)行程序7.6.5編譯打包代碼以及運(yùn)行程序4、編譯打包程序現(xiàn)在就可以編譯上面編寫(xiě)的代碼。可以直接點(diǎn)擊Eclipse工作界面上部的運(yùn)行程序的快捷按鈕,當(dāng)把鼠標(biāo)移動(dòng)到該按鈕上時(shí),在彈出的菜單中選擇“Runas”,繼續(xù)在彈出來(lái)的菜單中選擇“JavaApplication”,如下圖所示。7.6.5編譯打包代碼以及運(yùn)行程序然后,會(huì)彈出如下圖所示界面。7.6.5編譯打包代碼以及運(yùn)行程序點(diǎn)擊界面右下角的“OK”按鈕,開(kāi)始運(yùn)行程序。程序運(yùn)行結(jié)束后,會(huì)在底部的“Console”面板中顯示運(yùn)行結(jié)果信息(如下圖所示)。7.6.5編譯打包代碼以及運(yùn)行程序下面就可以把Java應(yīng)用程序打包生成JAR包,部署到Hadoop平臺(tái)上運(yùn)行?,F(xiàn)在可以把詞頻統(tǒng)計(jì)程序放在“/usr/local/hadoop/myapp”目錄下。如果該目錄不存在,可以使用如下命令創(chuàng)建:$cd/usr/local/hadoop$mkdirmyapp7.6.5編譯打包代碼以及運(yùn)行程序首先,請(qǐng)?jiān)贓clipse工作界面左側(cè)的“PackageExplorer”面板中,在工程名稱(chēng)“WordCount”上點(diǎn)擊鼠標(biāo)右鍵,在彈出的菜單中選擇“Export”,如下圖所示。7.6.5編譯打包代碼以及運(yùn)行程序然后,會(huì)彈出如下圖所示界面。7.6.5編譯打包代碼以及運(yùn)行程序在該界面中,選擇“RunnableJARfile”,然后,點(diǎn)擊“Next>”按鈕,彈出如下圖所示界面。7.6.5編譯打包代碼以及運(yùn)行程序在該界面中,“Launchconfiguration”用于設(shè)置生成的JAR包被部署啟動(dòng)時(shí)運(yùn)行的主類(lèi),需要在下拉列表中選擇剛才配置的類(lèi)“WordCount-WordCount”。在“Exportdestination”中需要設(shè)置JAR包要輸出保存到哪個(gè)目錄,比如,這里設(shè)置為“/usr/local/hadoop/myapp/WordCount.jar”。在“Libraryhandling”下面選擇“ExtractrequiredlibrariesintogeneratedJAR”。然后,點(diǎn)擊“Finish”按鈕,會(huì)出現(xiàn)如下圖所示界面。7.6.5編譯打包代碼以及運(yùn)行程序可以忽略該界面的信息,直接點(diǎn)擊界面右下角的“OK”按鈕,啟動(dòng)打包過(guò)程。打包過(guò)程結(jié)束后,會(huì)出現(xiàn)一個(gè)警告信息界面,如下圖所示。7.6.5編譯打包代碼以及運(yùn)行程序可以忽略該界面的信息,直接點(diǎn)擊界面右下角的“OK”按鈕。至此,已經(jīng)順利把WordCount工程打包生成了WordCount.jar??梢缘絃inux系統(tǒng)中查看一下生成的WordCount.jar文件,可以在Linux的終端中執(zhí)行如下命令:cd/usr/local/hadoop/myappls可以看到,“/usr/local/hadoop/myapp”目錄下已經(jīng)存在一個(gè)WordCount.jar文件。7.6.5編譯打包代碼以及運(yùn)行程序5、運(yùn)行程序在運(yùn)行程序之前,需要啟動(dòng)Hadoop,命令如下:c

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論