




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
5布式計(jì)算利器——(一以下是本章學(xué)習(xí)要點(diǎn)MapReduce原理MapReduceWritableMapReduce是Hadoop的組成,是于進(jìn)行數(shù)據(jù)計(jì)算的。本章主要研究如何使用MapReduce完成Hadoop中的計(jì)算任務(wù)。讀者應(yīng)該重點(diǎn)掌握實(shí)現(xiàn)MapReduce算法的步驟,掌握map、reduce函數(shù)的特點(diǎn)、如何寫(xiě)函數(shù)。我們的開(kāi)發(fā)環(huán)境還是在宿主機(jī)中運(yùn)行的eclipse,運(yùn)行程序的時(shí)候經(jīng)常會(huì)出現(xiàn)java內(nèi)存不足的情況,請(qǐng)參考圖5-1修改虛擬機(jī)內(nèi)存參數(shù):5-Map、Reduce如果我們把MapReduce拆開(kāi)看,就是兩個(gè)單詞map和reduce。在本書(shū)中,map翻譯為Pythonmap、reducemap5-5-5-25map函數(shù),該函數(shù)接收兩個(gè)參數(shù),第一個(gè)是函數(shù);第二個(gè)是剛才定義的列表變量。函數(shù)有一個(gè)形參是x,返回值就是x+3的結(jié)果,相當(dāng)于返回對(duì)參數(shù)+3返回。m表示map運(yùn)行后的記過(guò)。第三行是打印輸m。第四行是輸出的內(nèi)容。從例子中可以看到,map函數(shù)是把第一個(gè)形參函數(shù)作用于每一個(gè)列表元素。列表元素有5個(gè),那么函數(shù)就會(huì)被調(diào)用5次,每次調(diào)用把元素作為函數(shù)的形參傳入,最終結(jié)果是還是含有5個(gè)元素的列表。下面再看一下reduce函數(shù),如圖5-5-在上圖中,第一句是加載函數(shù)所在的包,類似于java中的import語(yǔ)句。第二句是定義5reducemap函數(shù)類似,也是接收兩個(gè)參數(shù),第一個(gè)參數(shù)是定義的函數(shù),第二個(gè)參數(shù)是剛才定義的列表變量。函數(shù)有兩個(gè)形參xy,返回值就是x+y運(yùn)算的結(jié)果,s表示運(yùn)算后的結(jié)果。第四行語(yǔ)句表示打印輸s。第五行是輸出的結(jié)果。從例子中可以看出,函數(shù)的形參有兩個(gè),分別是x和y,取值來(lái)自于第二個(gè)形參結(jié)果。這就是reduce函數(shù)。注意:以上是函數(shù)式語(yǔ)言Pton的語(yǔ)法,允許函數(shù)作為函數(shù)的形參,這在ja中是不允許的。讀者對(duì)此不必過(guò)分關(guān)心,只需要知道m(xù)a、reduce函數(shù)在其他語(yǔ)言中也是存在的,并不是adoop的專利。Hadoopmap函數(shù)位于內(nèi)置類org.apache.hadoop.mapreduce.Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT>中,reduce函數(shù)位于內(nèi)置類org.apache.hadoop.mapreduce.對(duì)于Hadoopmap函數(shù)和reduce函數(shù),處理的數(shù)據(jù)是鍵值對(duì),也就是說(shuō)map函數(shù)接現(xiàn)在再看一下Mapper類,有四個(gè)泛型,分別是KEYIN、VALUEIN、KEYOUT、VALUEOUT,前面兩個(gè)KEYINVALUEIN指的是map函數(shù)輸入的參數(shù)keyvalue的類型;后面兩個(gè)KEYOUT、VALUEOUTmap函數(shù)輸出的key、value的類型。map函數(shù)定義如圖5-45-在圖5-4中,輸入?yún)?shù)key、value的類型就是KEYIN、VALUEIN,每一個(gè)鍵值對(duì)都會(huì)調(diào)用一次map函數(shù)。在這里,map函數(shù)沒(méi)有處理輸入的key、value,直接通過(guò)context.write(…)方法輸出了,輸出的key、value的類型就是KEYOUT、VALUEOUT。這是默認(rèn)實(shí)現(xiàn),通常是需要看一下Reducer類,也有四個(gè)泛型,同理,分別指的是reduce函數(shù)輸入的key、類型,和輸出的key、value類型??匆幌聄educe函數(shù)定義,如圖5-5-5-在圖-5中,edce函數(shù)的形參ey、vlue的類型是KEIN、VLEIN。要注意這里的le是存在于j.lng.Ile<VLEI>中的,這是一個(gè)迭代器,用于集合遍歷的,意味著les是一個(gè)集合。ede函數(shù)默認(rèn)實(shí)現(xiàn)是把每個(gè)vle和對(duì)應(yīng)的y,通過(guò)調(diào)用coewite(…)輸出了,這里輸出的類型是KEOUT、LEOUT。通常我們會(huì)根據(jù)業(yè)務(wù)邏輯覆蓋edce函數(shù)的實(shí)現(xiàn)。現(xiàn)在讀者會(huì)有幾個(gè)問(wèn)題,輸入的內(nèi)容在哪里,輸入內(nèi)容如何解析成鍵值對(duì) 函數(shù) 函數(shù)如何聯(lián)系在一起,輸出到哪里等等?請(qǐng)繼續(xù)向下看MapReduceMapReduce運(yùn)行的時(shí)候,會(huì)通過(guò)Mapper運(yùn)行的任務(wù)HDFS中的數(shù)據(jù)文件,然后調(diào)用自己的方法,處理數(shù)據(jù),最后輸出。ReducerMapper任務(wù)輸出的數(shù)據(jù),作為自己的輸入數(shù)據(jù),調(diào)用自己的方法,最后輸出到HDFS的文件中。整個(gè)流程如圖5-65- 每個(gè)Mapper任務(wù)是一個(gè)java進(jìn)程,它會(huì)HDFS中的文件,解析成很多的鍵值對(duì),經(jīng)又可以分為以下幾個(gè)階段,如圖5-75-5-在圖5-7中,把Mapper任務(wù)的運(yùn)行過(guò)程分為六個(gè)階第一階段是把輸入文件按照一定的標(biāo)準(zhǔn)分片InuSlit),每個(gè)輸入片的大小是固定的。默認(rèn)情況下,輸入片InputSlit)的大小與數(shù)據(jù)塊Block)的大小是相同的。如果數(shù)據(jù)塊(Blck)的大小是默認(rèn)值64MB32MB72MB。那么小的文件是一個(gè)每一個(gè)輸入片由一個(gè)apper進(jìn)程處理。這里的三個(gè)輸入片,會(huì)有三個(gè)Maper進(jìn)程處理。本內(nèi)容解析成鍵值對(duì)是每一行的起始位置(單位是字節(jié)),“值”是本行的文本內(nèi)容。第三階段是調(diào)Mapper類中map方法。第二階段中解析出來(lái)的每一個(gè)鍵值對(duì),調(diào)用一次map方法。如果1000個(gè)鍵值對(duì),就會(huì)調(diào)用1000map方法。每一次map方第四階段是按照一定的規(guī)則對(duì)第三階段輸出的鍵值對(duì)進(jìn)行分區(qū)。比較是基于鍵進(jìn)行的。比如我們的鍵表示省份如、、山東等),那么就可以按照不同省份進(jìn)行分區(qū),同一個(gè)省份的鍵值對(duì)劃分到一個(gè)區(qū)中。默認(rèn)是只有一個(gè)區(qū)分區(qū)的數(shù)量就是Rducr任務(wù)運(yùn)行的數(shù)量。默認(rèn)只有一個(gè)Redcer任務(wù)。第五階段是對(duì)每個(gè)分區(qū)中的鍵值對(duì)進(jìn)行排序。首先,按照鍵進(jìn)行排序,對(duì)于鍵相同的鍵值對(duì),按照值進(jìn)行排序。比如三個(gè)鍵值對(duì)<,2>、<,3>、<,1>,鍵和值分別是整數(shù)。那么排序后的結(jié)果是<,3><,1><,2>。如果有第六階段,那么進(jìn)入第六階段;如果沒(méi)有,直接輸出到本地的linux文件中。第六階段是對(duì)數(shù)據(jù)進(jìn)行歸約處理,也就是reduce處理。鍵相等的鍵值對(duì)會(huì)調(diào)用一次reduce方法。經(jīng)過(guò)這一階段,數(shù)據(jù)量會(huì)減少。歸約后的數(shù)據(jù)輸出到本地的linxu文件中。本階段默認(rèn)是沒(méi)有的,需要用戶自己增加這一階段的代碼。 任務(wù)的執(zhí)行過(guò)后寫(xiě)入到HDFS中,可以分為如圖5-8所示的幾個(gè)階段5-會(huì)有很多,因此Reducer會(huì)多個(gè)Mapper的輸出。第三階段是對(duì)排序后的鍵值對(duì)調(diào)用reduce方法。鍵相等的鍵值對(duì)調(diào)用一次reduce方法,HDFS文件中。在整個(gè)MapReduce程序的開(kāi)發(fā)過(guò)程們最大的工作量是覆蓋map函數(shù)和覆鍵值對(duì)的編在對(duì)Mapper任務(wù)、Reducer任務(wù)的分析過(guò)程中,會(huì)看到很多階段都出現(xiàn)了鍵值對(duì),讀者容易,所以這里對(duì)鍵值對(duì)進(jìn)行編號(hào),方便大家理解鍵值對(duì)的變化情況。如圖5-95-在圖5-9中,對(duì)于Mapper任務(wù)輸入的鍵值對(duì),定義為key1和value1。在map方法中處理后,輸出的鍵值對(duì),定義為key2和value2。reduce方法接收key2和value2,處理后,key3value3key1value1簡(jiǎn)寫(xiě)為<k1,v1>,key2和value2簡(jiǎn)寫(xiě)為<k2,v2>,key3和value3簡(jiǎn)寫(xiě)為<k3,v3>。舉例:?jiǎn)卧~計(jì)下面看一下源文件的內(nèi)容,如5-9-15-9-內(nèi)容很簡(jiǎn)單,兩行文本,每行的單詞中間使用空格區(qū)分析思路:最直觀的想法是使用數(shù)據(jù)結(jié)構(gòu)Map。解析文件中出現(xiàn)的每個(gè)單詞,用單詞作為ey,出現(xiàn)次數(shù)作為lue。這個(gè)思路沒(méi)有問(wèn)題,但是在大數(shù)據(jù)環(huán)境下就。我們需要使用MaRedceMaper任務(wù)和Reucer任務(wù)的運(yùn)行階段,我們知道在Maper任務(wù)的第二階段是把文件的每一行轉(zhuǎn)化成鍵值對(duì),那么第三階段的map方法就能取得每一行文本內(nèi)容,我們可以在mp方法統(tǒng)計(jì)本行文本中單詞出現(xiàn)的次數(shù),把每個(gè)單詞的出現(xiàn)次數(shù)作為新的鍵值對(duì)輸出。在edcer任務(wù)的第二階段會(huì)對(duì)Maper任務(wù)輸出的鍵值對(duì)按照鍵進(jìn)行排序,鍵相等的鍵值對(duì)會(huì)調(diào)用一次euce數(shù)。因此可以在reuce方法中對(duì)單詞的不中的所有出現(xiàn)次數(shù)相加,結(jié)果就是該單詞的總的出現(xiàn)次數(shù)。最后把這個(gè)結(jié)果輸出??匆幌氯绾胃采wmap方 finalTextkey2=new finalIntWritablevalue2=new finalString[]splited=value.toString().split("for(Stringword:{context.write(key2,value2);}}上面代碼中,注意Mapper類的泛型不是java的基本類型,而是Hadoop的數(shù)據(jù)類型LongWritable、Text、IntWritable。讀者可以簡(jiǎn)單的等價(jià)為java的類long、String、int。下文會(huì)有專門(mén)講Hadoop的數(shù)據(jù)類型。代碼中Mapper類的泛型依次是<k1,v1,k2,v2>。map方法的第二個(gè)形參是行文本內(nèi)容,是我們關(guān)心的。代碼是把行文本內(nèi)容按照空格拆分,把每個(gè)單詞作為新的鍵,數(shù)值1作為新的值,寫(xiě)入到上下文context中。在這里,因?yàn)檩敵龅氖敲總€(gè)單詞,所以出現(xiàn)次數(shù)是常量1。如果一行文本中包括兩個(gè)o,會(huì)輸出兩次<o,1>。再來(lái)看一下如何覆蓋reduce方finalIntWritablevalue3=new context上下文對(duì)protectedvoidreduce(Textkey,java.lang.I Contextcontext)throwsjava.io.IOException,InterruptedException{intsum=for(IntWritablecount:{sum+=}finalTextkey3=}上面代碼中,Reducer類的四個(gè)泛型依次是<k2,v2,k3,v3>reduce方法的第二個(gè)參數(shù)是java.lang.Ible類型,迭代的是v2。也就是k2相同的v2都可以迭代出來(lái)。*驅(qū)動(dòng)代publicstaticvoidmain(String[]args)throwsIOException,InterruptedException,ClassNotFoundException{finalStringINPUT_PATH=finalStringOUTPUT_PATH=finalJobjob=newJob(newFileOutputFormat.setOutputPath(jobnewPath(OUTPUT_PATH));}在以上代碼中,我們創(chuàng)建了一個(gè)job對(duì)象,這個(gè)對(duì)象封裝了我們的任務(wù),可以提交到Hadoop獨(dú)立運(yùn)行。最后一句 pletion(true),表示把job對(duì)象提交給Hadoop運(yùn)以上代碼的運(yùn)行方式有兩種,一種是在宿主機(jī)的eclipse環(huán)境中運(yùn)行,一種是打成第一種運(yùn)行方式要求宿主機(jī)能夠linux,并且對(duì)于輸入路徑和輸出路徑中的主機(jī)名hadoop0hostshostsC:\WINDOWS\system32\drivers\etc文件夾。jarlinuxhadoopjarxxx.jar運(yùn)5-運(yùn)行結(jié)束后,文件路徑在df://hadop:9000/uptpat--0000。我們看一下輸出結(jié)果,如圖-0-1圖5-10-基本數(shù)據(jù)類序列化是干什么用的?本質(zhì)上講,就是數(shù)據(jù)保存到j(luò)ava虛擬機(jī)之外,然后又被讀到j(luò)ava虛擬機(jī)內(nèi).如果僅僅是保存,不管是否能讀進(jìn)java虛擬機(jī)的話,就不關(guān)心序列化問(wèn)題了。正是因?yàn)樾枰蛔x進(jìn)java虛擬機(jī),所以必須識(shí)別寫(xiě)出、讀入的格式、字符順序等問(wèn)題。因此序列化也就是比較重視的事情了。拿來(lái)打比方。序列化就像加密,反序列化就像Hadoop作為分布式系統(tǒng)必然涉及到序列化問(wèn)題面的例子中我們看到Mapper、Reducer類中都使用了Hadoop自己的數(shù)據(jù)類型LongWritableIntWritableText。這些數(shù)據(jù)類型都有一個(gè)共同的特點(diǎn),就是實(shí)現(xiàn)了org.apache.hadoop.io.Writable接口。我們看一下這個(gè)接口的源碼,如圖5-5-5-11中可以看Writable接口只有兩個(gè)方法,一個(gè)是writer方法,一個(gè)是readFields方法。前者是把對(duì)象的屬性序列化到DataOutput中去,后者是從DataInput把數(shù)還有對(duì)應(yīng)的VintWritable、VlongWritable。除此類型之外,還有字符串類型Text、字節(jié)數(shù)組類型BytesWritable、空類型NullWritable、對(duì)象類型ObjectWritable。以上這些類型構(gòu)成了mapreduce運(yùn)算的基本類型。這些類型都實(shí)現(xiàn)了接 parable,如圖5-5-從圖5-12Comparable我們看一下LongWritable類的源碼,如圖5-135-從圖5-13中可以看到,該類實(shí)現(xiàn)了 parable接口,內(nèi)部有個(gè)long類型的屬性value,在readFields方法中從in中把long類型的值讀出來(lái),賦給value,這是“反序列化”過(guò)程;在write方法中把value寫(xiě)入到out中,這是“序列化”過(guò)程。讀者可以想一下:自己是否可以封裝一個(gè)復(fù)雜的除了基本類型外,還有集合類 ArrayWritable、TwoDArrayWritable、MapWritableSortedMapWritable集合數(shù)據(jù)類上傳文件時(shí),如果文件的size小于blocksize,那么每個(gè)文件就會(huì)占用一個(gè)block(不是個(gè)block在NameNode的內(nèi)存中都會(huì)有一個(gè)描述信息,這樣會(huì)占用過(guò)多的NameNode內(nèi)存。SequenceFile可以把大量小文件一起放到一個(gè)block中。在相同數(shù)量的文件時(shí),可以明顯減少block的數(shù)量。假設(shè)有3個(gè)小文件,那么會(huì)產(chǎn)生3個(gè)block,那么4個(gè)文件后對(duì)應(yīng)的block如圖5-5-如果使用SequenceFile后,只會(huì)產(chǎn)生一個(gè)block,如圖5-5-另外,SequenceFile還可以壓縮的內(nèi)容,進(jìn)一步減少文件體積。輸入文件格式化類InputFomatHDFSmap函數(shù)的輸入部分的。驗(yàn)證輸入信息的,包括輸入路徑是否存在等把HDFS中的文件按照一定規(guī)則拆分成InputSplit,每個(gè)InputSplit由一個(gè)我們看一下這個(gè)類的源碼,如圖5-165-從圖5-16中可以看到,該類只有兩個(gè)方法的,方法getSplits的作用是把輸入文件劃分為很多的輸入分片,方法createRecordReader的作用是輸入分片的記錄器。這些方法的InputFormat有個(gè)子類是FileInputFormat,這是在我們的例子中見(jiàn)到的,我們看一下該getSplits方法的實(shí)現(xiàn),如圖5-17。5-5-17247minSizegetFormatMinSplitSize()方法的值是1,getMinSplitSize(job)方法的值由配置參數(shù)mapred.min.split.size指定,默認(rèn)值是1,所以minSize的默認(rèn)值就是1248行計(jì)算maxSize,是供后面計(jì)算使用的,值由配mapred.max.split.sizelong252files列表中存放的是253254行是獲得文件路徑,第256行是獲得文件長(zhǎng)度,第257行是獲得文件塊位置。如果文件非空,并且文件允64MB260行是計(jì)算輸入塊sizecomputeSplitSize方法,如圖5-185-5-18中可以看size由三個(gè)因素決定,分別minSizemaxSizeblockSize。根據(jù)前面的數(shù)值,可以得知,輸入分片的默認(rèn)size是文件塊size。我們回到圖5-17中繼續(xù)分析,在第263至268行的循環(huán)體中,是對(duì)文件按照輸入分總結(jié)一下上面的分析,如果輸入文件有3個(gè),那么產(chǎn)生的輸入分片的情況如表5-1所文件大產(chǎn)生的輸入輸入文件1輸入文件1輸入文件2注:參數(shù)mapred.min.split.size、mapred.max.split.size、dfs.block.size采用默認(rèn)5-注意:每一個(gè)輸入分片啟動(dòng)一個(gè)Mapper任務(wù)。源碼在JobInProcess中,如圖5-5-該類中有個(gè)很重要的方法是實(shí)現(xiàn)InputFormat中的createRecordReader,如圖5-5-如圖5-21。5-key和value表示
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 去電腦店兼職報(bào)告范文
- 2025年度智能穿戴設(shè)備維修與用戶體驗(yàn)提升合同
- 2025年度藝術(shù)品拍賣(mài)授權(quán)書(shū)模板
- 二零二五年度酒店宴會(huì)退訂及違約處理合同樣本
- 二零二五年度醫(yī)療耗材租賃與維護(hù)服務(wù)合同
- 二零二五年度著作權(quán)集體管理組織會(huì)員著作權(quán)許可合同
- 酒店保安知識(shí)培訓(xùn)課件
- 2025遼寧鞍山市臺(tái)安綠潔創(chuàng)能生態(tài)科技有限公司招聘6人筆試參考題庫(kù)附帶答案詳解
- 焊接知識(shí)培訓(xùn)課件
- 江畔朝陽(yáng) 職引未來(lái)-大學(xué)生職業(yè)生涯規(guī)劃知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋黑龍江科技大學(xué)
- 《Spring框架》教學(xué)課件
- 七年級(jí)下冊(cè)《平行線的判定》課件與練習(xí)
- 2025年中考英語(yǔ)時(shí)文閱讀 6篇有關(guān)電影哪吒2和 DeepSeek的英語(yǔ)閱讀(含答案)
- 修高速土方合同范例
- 2024年形勢(shì)與政策復(fù)習(xí)題庫(kù)含答案(綜合題)
- 江蘇省南通市2025屆高三第一次調(diào)研測(cè)試數(shù)學(xué)試題(南通一模)(含答案)
- DCMM數(shù)據(jù)管理師練習(xí)測(cè)試卷
- 油氣行業(yè)人才需求預(yù)測(cè)-洞察分析
- 檢修安全知識(shí)培訓(xùn)課件
- 學(xué)校心理健康教育存在的問(wèn)題及改進(jìn)措施
- 合成生物學(xué)研發(fā)平臺(tái)與年產(chǎn)200噸合成生物制品項(xiàng)目可行性研究報(bào)告寫(xiě)作模板-申批備案
評(píng)論
0/150
提交評(píng)論