




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Hadoop大數(shù)據(jù)項(xiàng)目開發(fā)——認(rèn)識MapReduce目錄content02MapReduce設(shè)計(jì)思想01MapReduce簡介03MapReduce特點(diǎn)MapReduce簡介在大數(shù)據(jù)時(shí)代,數(shù)據(jù)量非常大,不能把數(shù)據(jù)放在一個(gè)單機(jī)上運(yùn)行,而是借助一個(gè)集群通過多臺機(jī)器同時(shí)并行處理大規(guī)模數(shù)據(jù)集,幫助我們獲得海量的計(jì)算能力;單機(jī)無法運(yùn)行集群多臺機(jī)器并行處理MapReduce簡介開源實(shí)現(xiàn)谷歌公司最早提出分布式并行編程MapReduce,Hadoop平臺對它進(jìn)行了開源實(shí)現(xiàn),成為Hadoop平臺兩個(gè)核心組件之一。MapReduce簡介任何一個(gè)節(jié)點(diǎn)出現(xiàn)問題不會影響其他節(jié)點(diǎn)正常運(yùn)行,又設(shè)置了冗余和容錯(cuò)機(jī)制。整個(gè)集群可以隨意增加減少計(jì)算節(jié)點(diǎn),計(jì)算節(jié)點(diǎn)只需要很廉價(jià)的PC機(jī)。只需要告訴Hadoop“做什么?”,整個(gè)系統(tǒng)框架自動實(shí)現(xiàn)分布式部署。Hadoop平臺對Google上的MapReduce進(jìn)行了很多相關(guān)的優(yōu)化處理:集群架構(gòu)和容錯(cuò)性硬件價(jià)格及擴(kuò)展性編程和學(xué)習(xí)難度MapReduce設(shè)計(jì)思想Reduce函數(shù)Map函數(shù)屏蔽所有編程細(xì)節(jié),把復(fù)雜的并行編程過程高度抽象為:MapReduce名稱的由來:MapReduce整個(gè)框架中核心設(shè)計(jì)只有這兩個(gè)函數(shù),底層的細(xì)節(jié)都被隱藏掉了,所以它極大的降低了分布式并行編程的難度,這是MapReduce的突出優(yōu)點(diǎn)。MapReduce設(shè)計(jì)思想策略理念函數(shù)兩個(gè)函數(shù)一個(gè)策略一個(gè)理念MapReduce的設(shè)計(jì)思想總結(jié)有:一個(gè)策略,一個(gè)理念,兩個(gè)函數(shù)。MapReduce設(shè)計(jì)思想一個(gè)策略:“分而治之”第一步:MapReduce采用分而治之;第二步:把非常龐大的數(shù)據(jù)集,切分成非常多的獨(dú)立小分片;第三步:然后為每一個(gè)分片單獨(dú)地啟動一個(gè)Map任務(wù);最后:最終通過多個(gè)Map任務(wù),并行地在多個(gè)機(jī)器上去處理。MapReduce設(shè)計(jì)思想一個(gè)理念:”計(jì)算向數(shù)據(jù)靠攏”機(jī)器:數(shù)據(jù)機(jī)器:數(shù)據(jù)機(jī)器:數(shù)據(jù)機(jī)器:計(jì)算在大數(shù)據(jù)計(jì)算設(shè)計(jì)時(shí),采用“計(jì)算向數(shù)據(jù)靠攏”,移動計(jì)算比移動數(shù)據(jù)更加經(jīng)濟(jì),大大減少了整個(gè)網(wǎng)絡(luò)中數(shù)據(jù)傳輸開銷,大大提升整個(gè)分布式程序的處理性能。機(jī)器:數(shù)據(jù)MapReduce設(shè)計(jì)思想MapReduce把復(fù)雜的并行編程過程高度抽象為Map和Reduce兩個(gè)函數(shù)Map對一組數(shù)據(jù)元素進(jìn)行某種重復(fù)式的處理,提取數(shù)據(jù)的特征。Reduce對Map的中間結(jié)果進(jìn)行某種進(jìn)一步的結(jié)果整理。兩個(gè)函數(shù):Map函數(shù)和Reduce函數(shù)=+MapReduce設(shè)計(jì)思想統(tǒng)一構(gòu)架,隱藏系統(tǒng)層細(xì)節(jié)通過抽象模型和計(jì)算框架把需要“做什么”與“怎么做”分開,為設(shè)計(jì)者提供一個(gè)高層的編程接口和框架。將具體完成并行計(jì)算任務(wù)相關(guān)的諸多系統(tǒng)層細(xì)節(jié)隱藏起來,交給計(jì)算框架去處理。MapReduce優(yōu)點(diǎn)0203易于編程良好的擴(kuò)展性高容錯(cuò)性01只需要告訴Hadoop“做什么?”,整個(gè)系統(tǒng)框架自動實(shí)現(xiàn)分布式部署。整個(gè)集群可以隨意增加減少計(jì)算節(jié)點(diǎn),計(jì)算節(jié)點(diǎn)只需要很廉價(jià)的PC機(jī)。任何一個(gè)節(jié)點(diǎn)出現(xiàn)問題不會影響其他節(jié)點(diǎn)正常運(yùn)行,又設(shè)置了冗余和容錯(cuò)機(jī)制。MapReduce不足不擅長實(shí)時(shí)計(jì)算不擅長流式計(jì)算不擅長有向圖計(jì)算性能局限應(yīng)用局限MapReduce不足不擅長流式計(jì)算不擅長有向圖計(jì)算不擅長實(shí)時(shí)計(jì)算MapReduce無法在毫秒或者秒級內(nèi)返回結(jié)果。321流式計(jì)算的輸入數(shù)據(jù)是動態(tài)的,而MapReduce的輸入數(shù)據(jù)集是靜態(tài)的,不能動態(tài)變化;MapReduce適用于海量數(shù)據(jù)的離線批處理;不適合數(shù)據(jù)事務(wù)處理或單一請求處理。多個(gè)應(yīng)用程序存在依賴關(guān)系,后一個(gè)應(yīng)用程序的輸入為前一個(gè)的輸出。在這種情況下,MapReduce并不是不能做,而是使用后,每個(gè)MapReduce作業(yè)的輸出結(jié)果都會寫入到磁盤,會造成大量的磁盤IO開銷,導(dǎo)致性能非常低。MapReduce不足Map任務(wù)和Reduce任務(wù)存在著嚴(yán)格的依賴關(guān)系,Map任務(wù)的中間結(jié)果存儲在本地磁盤上,Reduce任務(wù)需要從磁盤上獲取Map計(jì)算的中間結(jié)果并將其作為Reduce的輸入,這樣就會產(chǎn)生大量的磁盤IO開銷,使得計(jì)算機(jī)性能降低。性能局限MapReduce不適合一般的Web應(yīng)用,因?yàn)檫@些應(yīng)用只是簡單的數(shù)據(jù)訪問且每次訪問請求所需要的資源非常少,同時(shí)還需要滿足高并發(fā)訪問需求。應(yīng)用局限本節(jié)小結(jié)MapReduce是針對大規(guī)模集群中的分布式文件進(jìn)行并行處理的計(jì)算模型;MapReduce設(shè)計(jì)目標(biāo)就是讓不熟悉分布式并行編程的開發(fā)人員,將自己的程序輕松運(yùn)行在分布式系統(tǒng)上。Hadoop大數(shù)據(jù)項(xiàng)目開發(fā)——MapReduce工作流程目錄content02Reduce過程Map過程0405寫入文件01分片和格式化數(shù)據(jù)源03Shuffle過程MapReduce工作流程概述MapReduce編程簡單且功能強(qiáng)大。專門為并行處理大規(guī)模數(shù)據(jù)而設(shè)計(jì)。對于簡單數(shù)據(jù)處理,只需要執(zhí)行Map任務(wù)。對于復(fù)雜任務(wù),根據(jù)實(shí)際的業(yè)務(wù)需求設(shè)置合適的Reduce任務(wù)數(shù)。MapReduce工作流程MapReduce工作流程第一步:分片和格式化數(shù)據(jù)源將存儲在分布式文件系統(tǒng)中數(shù)據(jù)集切分成獨(dú)立的輸入分片。每一個(gè)輸入分片對應(yīng)一個(gè)Map任務(wù)(有多少輸入分片就會存在多少M(fèi)ap任務(wù))。輸入分片是邏輯概念。輸入分片中存儲了一些元數(shù)據(jù)信息。輸入分片處理成<key1,value1>形式的數(shù)據(jù),再傳遞給Map任務(wù)。第二步:Map過程TWITTERSKYPEFACEBOOK經(jīng)過map()函數(shù)處理后,獲得一系列<key2,value2>形式的輸出。Map過程利用map()函數(shù)來處理數(shù)據(jù)。map()函數(shù)中具體的數(shù)據(jù)處理方法由用戶自己定義。map()函數(shù)接收<key1,value1>形式的數(shù)據(jù)輸入。1234YOUTUBE第三步:Shuffle過程
Shuffle過程map()函數(shù)的輸出并不會直接交給Reduce任務(wù),而是需要經(jīng)過分區(qū)、排序、合并、溢寫、歸并等處理,將處理后的數(shù)據(jù)作為Reduce任務(wù)的輸入。這一系列處理過程稱為Shuffle。第三步:Shuffle過程
Map的Shuffle過程1.Map端的Shuffle過程(1)map()函數(shù)的輸出并不會立即寫入磁盤,MapReduce會為每個(gè)Map任務(wù)分配一個(gè)環(huán)形內(nèi)存緩沖區(qū)(bufferinmemory),用于存儲map()函數(shù)的輸出。(2)在將環(huán)形內(nèi)存緩沖區(qū)中的數(shù)據(jù)寫入磁盤之前,需要對數(shù)據(jù)進(jìn)行分區(qū)、排序和合并(可選)操作。第三步:Shuffle過程
Map的Shuffle過程1.Map端的Shuffle過程分區(qū):主要目的是將數(shù)據(jù)均勻地分配給Reduce任務(wù),以實(shí)現(xiàn)MapReduce的負(fù)載均衡。排序:MapReduce的默認(rèn)操作,主要是將Map任務(wù)的輸出按key進(jìn)行排序。每個(gè)分區(qū)中的數(shù)據(jù)都是有序的。合并:排序結(jié)束后,合并操作可根據(jù)需求選擇是否要執(zhí)行;合并操作是將具有相同key的<key,value>的value加起來,從而減少溢寫的數(shù)據(jù)量。第三步:Shuffle過程
Map的Shuffle過程1.Map端的Shuffle過程(3)環(huán)形內(nèi)存緩沖區(qū)中的數(shù)據(jù)一旦達(dá)到閾值,后臺線程便開始把數(shù)據(jù)溢寫到本地磁盤的臨時(shí)文件(即溢寫文件)中。(4)系統(tǒng)需要將所有溢寫文件中的數(shù)據(jù)進(jìn)行歸并,以生成一個(gè)大的溢寫文件。歸并操作就是將相同key的value歸并成一個(gè)集合,形成新的鍵值對。(5)文件歸并操作完成后生成最終的Map任務(wù)輸出文件,文件保存在Map任務(wù)所在節(jié)點(diǎn)的本地磁盤上,Map任務(wù)執(zhí)行結(jié)束。第三步:Shuffle過程2.Reduce端的Shuffle過程(1)Map任務(wù)結(jié)束,Reduce任務(wù)啟動相同數(shù)量的復(fù)制線程并行復(fù)制Map任務(wù)的輸出文件。(2)當(dāng)緩存中的數(shù)據(jù)達(dá)到閾值,即需要溢寫到磁盤時(shí),Reduce任務(wù)會將復(fù)制數(shù)據(jù)進(jìn)行歸并排序(MergeSort),生成溢寫文件。
Reduce的Shuffle過程Reduce過程Reduce任務(wù)接收歸并排序后的數(shù)據(jù)流,并對已有序的相同key的鍵值對調(diào)用一次reduce()函數(shù)。Reduce任務(wù)輸入是<key2,list(value2)>形式的中間結(jié)果,輸出的是<key3,value3>形式的計(jì)算結(jié)果。Reduce任務(wù)輸出結(jié)果經(jīng)過輸出格式化后再輸出到文件系統(tǒng)中,并且每個(gè)作業(yè)輸出文件默認(rèn)以“part-r-00000”開始,并用后5位數(shù)遞增的方式命名。123
Reduce過程寫入文件MapReduce框架會自動把ReduceTask生成的<key,value>傳入OutputFormat的write方法,實(shí)現(xiàn)文件的寫入操作。本節(jié)小結(jié)(2)Map過程(5)寫入文件(1)分片和格式化數(shù)據(jù)源(3)Shuffle過程(4)Reduce過程Hadoop大數(shù)據(jù)項(xiàng)目開發(fā)——單詞統(tǒng)計(jì)分析設(shè)計(jì)目錄content02設(shè)計(jì)思路01設(shè)計(jì)過程part-r-00000的內(nèi)容如下:part-r-00001的內(nèi)容如下:words1.txt的內(nèi)容如下:thisisagoodpigthatisagoodbearwords2.txt的內(nèi)容如下:thisisabadpigthatisabadbearMapReduce案例描述輸入文件是words1.txt和words2.txt兩個(gè)文本文件,文件內(nèi)容僅有字符串和空格。輸出文件為part-r-00000和part-r-00001,文件內(nèi)容是:文件中出現(xiàn)的單詞及單詞出現(xiàn)的次數(shù)。單詞統(tǒng)計(jì)?設(shè)計(jì)思路各個(gè)單詞之間的頻數(shù)不具有相關(guān)性,可以將不同的單詞分發(fā)到不同的節(jié)點(diǎn)上處理;在統(tǒng)計(jì)單詞數(shù)量任務(wù)中,可以將大的數(shù)據(jù)集切分成小的數(shù)據(jù)集,且各數(shù)據(jù)集之間相互獨(dú)立,方便并行處理;MapReduce單詞統(tǒng)計(jì)任務(wù)的解決思路符合MapReduce的編程思想。設(shè)計(jì)思路指定輸入文件所在的位置將兩個(gè)文件切分成兩個(gè)輸入分片,然后對輸入分片進(jìn)行格式化,文件按行分解,從而形成以行偏移量為key、行內(nèi)容為value的鍵值對。將鍵值對的value按空格分解成一個(gè)個(gè)單詞,生成<word,1>形式的鍵值對。輸入階段輸入分片及其格式化階段設(shè)計(jì)map()函數(shù)階段設(shè)計(jì)思路設(shè)計(jì)reduce()函數(shù),將輸入的<word,list(value)>形式的數(shù)據(jù)進(jìn)行匯總,最后生成以key為單詞、value為單詞頻數(shù)的鍵值對。系統(tǒng)默認(rèn)的輸出格式為“單詞+空格+單詞頻數(shù)”的形式,若要輸出特定樣式的數(shù)據(jù),需要對輸出結(jié)果進(jìn)行格式化,需要進(jìn)行指定。指定單詞統(tǒng)計(jì)程序的輸出結(jié)果文件位置。設(shè)計(jì)reduce()函數(shù)階段輸出格式化階段輸出階段設(shè)計(jì)過程1.輸入分片及其格式化:對輸入分片進(jìn)行格式化操作,形成<key1,value1>形式的數(shù)據(jù)流,key1為偏移量,從0開始,每讀取一個(gè)字符就增加1;value1為每行文本內(nèi)容。包括空格、換行符等設(shè)計(jì)過程map()函數(shù)將接收到的<key1,value1>形式的輸入數(shù)據(jù)流,按空格進(jìn)行拆分,輸出結(jié)果為<key2,1>形式的數(shù)據(jù)。key2為字符串形式的單詞,value的值為1,表示單詞數(shù)為1。2.Map過程設(shè)計(jì)過程將多個(gè)Map任務(wù)的<key2,value2>形式的輸出,處理成<key2,list(value2)>形式的中間結(jié)果。3.Shuffle過程設(shè)計(jì)過程reduce()函數(shù)接收<key2,list(value2)>形式的數(shù)據(jù)流,對相同單詞的值集合進(jìn)行計(jì)算,匯總出單詞出現(xiàn)的總次數(shù)。4.Reduce過程功能實(shí)現(xiàn)part-r-00000的內(nèi)容如下:part-r-00001的內(nèi)容如下:words1.txt的內(nèi)容如下:thisisagoodpigthatisagoodbearwords2.txt的內(nèi)容如下:thisisabadpigthatisabadbearMapReduce輸入分片及其格式化MapShuffleReduce單詞統(tǒng)計(jì)本節(jié)小結(jié)MapReduce編程規(guī)范單詞統(tǒng)計(jì)設(shè)計(jì)思路單詞統(tǒng)計(jì)設(shè)計(jì)過程Hadoop大數(shù)據(jù)項(xiàng)目開發(fā)——單詞統(tǒng)計(jì)功能代碼-Mapper實(shí)現(xiàn)目錄content02Reducer階段代碼編寫01Mapper階段代碼編寫03Drive階段代碼編寫pom.xml文件內(nèi)容<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-common</artifactId><version>2.9.2</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-core</artifactId><version>2.9.2</version></dependency>Mapper階段代碼publicclassWordCountMapperextendsMapper<LongWritable,Text,Text,IntWritable>{ @Override protectedvoidmap(LongWritablekey,Textvalue,Contextcontext) throwsIOException,InterruptedException{ Stringline=value.toString();//將Text類型轉(zhuǎn)成字符型 String[]words=line.split("");//切割單詞 for(Stringword:words){//遍歷words context.write(newText(word),newIntWritable(1)); } }}繼承Mapper類WordCountMapper類使用extends關(guān)鍵字繼承了Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT>類,輸入Mapper后會自動補(bǔ)全。重寫map方法重寫map方法刪除此行重寫map方法Stringline=value.toString();//將Text類型轉(zhuǎn)成字符型String[]words=line.split("");//切割漢字for(Stringword:words){//遍歷words context.write(newText(word),newIntWritable(1));}map()方法編寫邏輯代碼:Hadoop大數(shù)據(jù)項(xiàng)目開發(fā)——單詞統(tǒng)計(jì)分析-mapper代碼實(shí)現(xiàn)目錄content02Reducer類的編寫01Mapper類的編寫03Driver類的編寫添加依賴:hadoop-commonhadoop-hdfshadoop-client實(shí)戰(zhàn)開發(fā):WordCountMapperWordCountReducerWordCountMain/開發(fā)環(huán)境:mavenIDEA/Eclipse上傳運(yùn)行:hadoopjarwordcount-1.0-SNAPSHOT.jar
/input/data.txt/output/wc單詞統(tǒng)計(jì)功能開發(fā)流程引入依賴<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-common</artifactId><version>2.9.2</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-core</artifactId><version>2.9.2</version></dependency>本案例中的測試數(shù)據(jù)位于“G:/wordcount/input”的文件夾中。首先在新建項(xiàng)目中的pom.xml文件中引入依賴,如圖所示:Mapper類的編寫新建WordCountMapper類,該類繼承了org.apache.hadoop.mapreduce.Mapper類。WordCountMapper類是map()函數(shù)的執(zhí)行者,用戶需要根據(jù)數(shù)據(jù)處理需求重寫map()方法。創(chuàng)建WordCountMapper類Mapper類的編寫importjava.io.IOException;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.LongWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Mapper;publicclassWordCountMapperextendsMapper<LongWritable,Text,Text,IntWritable>{ @Override protectedvoidmap(LongWritablekey,Textvalue,Contextcontext) throwsIOException,InterruptedException{ Stringline=value.toString();//將Text類型轉(zhuǎn)成字符型 String[]words=line.split("");//切割單詞 for(Stringword:words){//遍歷words context.write(newText(word),newIntWritable(1)); } }}WordCountMapper類的代碼如圖所示:Mapper類的編寫上述代碼中可知,WordCountMapper類使用extends關(guān)鍵字繼承了Mapper<KEYIN,VALUEIN,KEYOUT,VALUEOUT>類,其中:KEYIN:是MapTask讀取到key的數(shù)據(jù)類型,是一行的起始偏移量的數(shù)據(jù)類型,使用長整型,在MapReduce中使用LongWritable。VALUEIN:是MapTask讀取到的數(shù)據(jù)的value的類型,是一行的內(nèi)容的數(shù)據(jù)類型,本案例中一行內(nèi)容的數(shù)據(jù)類型為文本型,在MapReduce中使用Text。KEYOUT:是用戶的自定義map方法要返回的結(jié)果Key-Value中的key的數(shù)據(jù)類型,在WordCount邏輯中,需要輸出的單詞是字符型,在MapReduce中使用Text。VALUEOUT:是用戶的自定義map方法要返回的結(jié)果Key-Value中value的數(shù)據(jù)類型,在wordcount邏輯中,需要輸出的單詞數(shù)量是整數(shù),在MapReduce中使用IntWritable。在mapreduce中,map產(chǎn)生的數(shù)據(jù)需要傳輸給reduce,需要進(jìn)行序列化和反序列化。而jdk中的原生序列化機(jī)制產(chǎn)生的數(shù)據(jù)量比較冗余,就會導(dǎo)致數(shù)據(jù)在mapreduce運(yùn)行過程中傳輸效率低下。所以,hadoop專門設(shè)計(jì)了自己的序列化機(jī)制,那么,mapreduce中傳輸?shù)臄?shù)據(jù)類型就必須實(shí)現(xiàn)hadoop自己的序列化接口。hadoop為jdk中的常用基本類型Long,String,Integer,F(xiàn)loat等數(shù)據(jù)類型封裝了自己的實(shí)現(xiàn)了hadoop序列化接口的類型:LongWritable,Text,IntWritable,F(xiàn)loatWritable。Mapper類的編寫Mapper類的編寫然后需要重寫map方法上述代碼中對map方法的重寫,可以通過快捷鍵實(shí)現(xiàn),使用Alt+Insert組合鍵會出現(xiàn)提示,如圖所示:在生成類的各項(xiàng)基本方法界面中選擇OverrideMethods,出現(xiàn)可以重寫的方法,選擇重寫方法界面如圖所示:Mapper類的編寫選中要重寫的方法之后,會出現(xiàn)如圖代碼,將代碼中的super.map(key,value,context);刪除,就可以在map()方法中編寫邏輯代碼,map()讀入進(jìn)來的數(shù)據(jù)為Text類型,要對單詞按空格進(jìn)行切分,需要將Text類型轉(zhuǎn)換為字符型,轉(zhuǎn)換代碼如下所示:Stringline=value.toString();//將Text類型轉(zhuǎn)成字符型刪除此行Mapper類的編寫其次,將讀入進(jìn)來的數(shù)據(jù)按照空格進(jìn)行切分,切分代碼如下所示:String[]words=line.split("");//切割單詞最后,需要將單詞轉(zhuǎn)換成為<單詞,1>的形式,遍歷切割完成后的單詞數(shù)組,將每個(gè)單詞都轉(zhuǎn)化成為<單詞,1>形式,代碼如下所示:for(Stringword:words){//遍歷words context.write(newText(word),newIntWritable(1)); }本節(jié)小結(jié)本節(jié)介紹編寫代碼實(shí)現(xiàn)單詞統(tǒng)計(jì)分析功能的Mapper,相信大家對Mapper代碼有了全新的認(rèn)識,為我們后續(xù)編寫MapReduce程序打下了堅(jiān)實(shí)的基礎(chǔ)。Hadoop大數(shù)據(jù)項(xiàng)目開發(fā)——單詞統(tǒng)計(jì)功能代碼-Redcuer實(shí)現(xiàn)目錄content02Reducer階段代碼編寫01Mapper階段代碼編寫03Drive階段代碼編寫Reducer階段代碼importjava.io.IOException;importjava.util.Iterator;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Reducer;publicclassWordcountReducerextendsReducer<Text,IntWritable,Text,IntWritable>{ @Override protectedvoidreduce(Textkey,Iterable<IntWritable>values, Contextcontext)throwsIOException,InterruptedException{ intcount=0; Iterator<IntWritable>iterator=values.iterator(); while(iterator.hasNext()){ IntWritablevalue=iterator.next(); count+=value.get();//對相同鍵值的單詞鍵值進(jìn)行累加 } context.write(key,newIntWritable(count)); }}繼承Reducer類代碼中使用extends關(guān)鍵字繼承Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT>類。此時(shí)Mapper的輸出,經(jīng)過Shuffle過程,成為Reducer的輸入,所以Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT>數(shù)據(jù)類型與Mapper輸出的數(shù)據(jù)類型一致,即Reducer<Text,IntWritable,Text,IntWritable>,輸入Reducer后會自動補(bǔ)全。重寫reduce方法重寫reduce方法刪除此行重寫reduce方法reduce()方法編寫邏輯代碼:intcount=0;Iterator<IntWritable>iterator=values.iterator();while(iterator.hasNext()){//判斷是否還有元素 IntWritablevalue=iterator.next();//獲取下一個(gè)元素 count+=value.get();//對相同鍵值的單詞鍵值進(jìn)行累加}context.write(key,newIntWritable(count));Hadoop大數(shù)據(jù)項(xiàng)目開發(fā)——單詞統(tǒng)計(jì)分析-Reducer代碼實(shí)現(xiàn)目錄content02Reducer類的編寫01Mapper類的編寫03Driver類的編寫Reducer類的編寫Mapper類編寫完成之后,需要編寫Reducer類新建WordCountReducer類,該類繼承了org.apache.hadoop.mapreduce.Reducer類。并重寫了reduce()方法,鍵值相同的數(shù)據(jù)會在同一個(gè)Reduce任務(wù)中處理,WordCountReducer類的代碼如圖所示:Reducer類的編寫importjava.io.IOException;importjava.util.Iterator;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Reducer;publicclassWordcountReducerextendsReducer<Text,IntWritable,Text,IntWritable>{ @Override protectedvoidreduce(Textkey,Iterable<IntWritable>values, Contextcontext)throwsIOException,InterruptedException{ intcount=0; Iterator<IntWritable>iterator=values.iterator(); while(iterator.hasNext()){ IntWritablevalue=iterator.next(); count+=value.get();//對相同鍵值的單詞鍵值進(jìn)行累加 } context.write(key,newIntWritable(count)); }}Reducer類的編寫在代碼中使用extends關(guān)鍵字繼承Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT>類;該Reducer功能主要用來實(shí)現(xiàn)對相同鍵值的單詞鍵值進(jìn)行累加;此時(shí)Mapper的輸出,經(jīng)過Shuffle過程,成為Reducer的輸入;所以Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT>數(shù)據(jù)類型與Mapper輸出的數(shù)據(jù)類型一致,即Reducer<Text,IntWritable,Text,IntWritable>。Reducer類的編寫KEYIN為Mapper任務(wù)key的輸出類型,也等同于Reducer任務(wù)key的輸入類型;VALUEIN為Mapper任務(wù)value的輸出類型,也等同于Reducer任務(wù)value的輸入類型;KEYOUT為Ruducer任務(wù)中reduce方法要返回的結(jié)果Key-Value中的key的數(shù)據(jù)類型,在WordCount邏輯中,需要輸出的單詞是字符型,在MapReduce中使用Text;VALUEOUT為Ruducer任務(wù)中reduce方法要返回的結(jié)果Key-Value中value的數(shù)據(jù)類型,在wordcount邏輯中,需要輸出的單詞數(shù)量是整數(shù),在MapReduce中使用IntWritable。重寫reduce方法然后需要重寫reducer方法;上述代碼中對map方法的重寫,可以通過快捷鍵實(shí)現(xiàn),使用Alt+Insert組合鍵會出現(xiàn)提示,如下所示:重寫reduce方法在生成類的各項(xiàng)基本方法界面中選擇OverrideMethods,出現(xiàn)可以重寫的方法,選擇重寫方法界面如右圖所示:重寫reduce方法刪除此行選中要重寫的方法之后,會出現(xiàn)如圖代碼,將代碼中的super.reduce(key,values,context);刪除。intcount=0;Iterator<IntWritable>iterator=values.iterator();while(iterator.hasNext()){//判斷是否還有元素 IntWritablevalue=iterator.next();//獲取下一個(gè)元素 count+=value.get();//對相同鍵值的單詞鍵值進(jìn)行累加}context.write(key,newIntWritable(count));重寫reduce方法在reduce()方法中編寫邏輯代碼:重寫reduce方法本節(jié)介紹了編寫代碼實(shí)現(xiàn)單詞統(tǒng)計(jì)分析功能的Reducer,相信大家對Reducer代碼有了全新的認(rèn)識,為我們后續(xù)編寫MapReduce程序打下了堅(jiān)實(shí)的基礎(chǔ)。Hadoop大數(shù)據(jù)項(xiàng)目開發(fā)——單詞統(tǒng)計(jì)功能代碼-提交任務(wù)實(shí)現(xiàn)目錄content02Reducer階段代碼編寫01Mapper階段代碼編寫03Drive階段代碼編寫提交任務(wù)代碼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.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;提交任務(wù)代碼publicclassWordCountJob{ publicstaticvoidmain(String[]args)throwsException{ Jobjob=Job.getInstance(); job.setJarByClass(JobSubmitter.class);//1、封裝參數(shù),jar包所在位置 //2、封裝參數(shù),job調(diào)用的Mapper和Reducer實(shí)現(xiàn)類 job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); //3、封裝參數(shù),job調(diào)用的Mapper和Reducer實(shí)現(xiàn)類中key和value數(shù)據(jù)類型 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class);
提交任務(wù)代碼 //4、封裝參數(shù),處理的數(shù)據(jù)和最終結(jié)果數(shù)據(jù)路徑 FileInputFormat.setInputPaths(job,newPath("G:\\wordcount\\input"));//G:\\wordcount\\input為文件所存放的路徑 FileOutputFormat.setOutputPath(job,newPath("G:\\wordcount\\output"));//G:\\wordcount\\output為文件中單詞出現(xiàn)的次數(shù)。 //5、可以設(shè)置啟動的reduce數(shù)量 job.setNumReduceTasks(2); //6、提交job給YARN booleanres=job.waitForCompletion(true); System.exit(res?0:-1); }}最終結(jié)果課外拓展在上面代碼中,實(shí)現(xiàn)了本地測試功能,處理的數(shù)據(jù)來源本地,但是實(shí)際生產(chǎn)環(huán)境中,數(shù)據(jù)位于HDFS上,那么該如何解決?本地直接提交給集群運(yùn)行生成Jar包提交給YARN運(yùn)行課外拓展System.setProperty("HADOOP_USER_NAME","hadoop");Configurationconf=newConfiguration();conf.set("fs.defaultFS","hdfs://hdp-01:9000");Jobjob=Job.getInstance(conf);FileInputFormat.setInputPaths(job,newPath("/wordcount/input"));FileOutputFormat.setOutputPath(job,newPath("/wordcount/output"));本地直接提交給集群,添加代碼如下:課外拓展該方式中,只需要將處理的數(shù)據(jù)和最終結(jié)果數(shù)據(jù)路徑修改為HDFS上的位置即可,然后打成Jar包提交給集群,詳細(xì)介紹在任務(wù)五中。打成Jar包直接提交給集群運(yùn)行:Hadoop大數(shù)據(jù)項(xiàng)目開發(fā)——單詞統(tǒng)計(jì)分析代碼-Driver實(shí)現(xiàn)目錄content02Reducer類的編寫01Mapper類的編寫03Driver類的編寫Driver類的編寫編寫完Mapper類和Reducer類之后,需要編寫Driver類,啟動程序。自定義WordCountdDriver類指定了輸入文件位置輸入文件格式類自定義Mapper類自定義Reducer類自定義OutputFormat類及輸出文件的位置;WordCountDriver類的代碼如下:本案例中的測試數(shù)據(jù)位于“G:/wordcount/input”的文件夾中。Driver類的編寫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.lib.input.FileInputFormat;importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;publicclassWordCountDriver{ publicstaticvoidmain(String[]args)throwsException{ //Job Jobjob=Job.getInstance(); //1、封裝參數(shù),驅(qū)動類對應(yīng)的字節(jié)碼對象 job.setJarByClass(WordCountJob.class); //2、封裝參數(shù),job調(diào)用Mapper和Reducer實(shí)現(xiàn)類 job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); //3、封裝參數(shù),job調(diào)用的Mapper和Reducer實(shí)現(xiàn)類中key和value數(shù)據(jù)類型Driver類的編寫 //3、封裝參數(shù),job調(diào)用的Mapper和Reducer實(shí)現(xiàn)類中key和value數(shù)據(jù)類型 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); //4、封裝參數(shù),處理的數(shù)據(jù)和最終結(jié)果數(shù)據(jù)路徑 FileInputFormat.setInputPaths(job,newPath("G:\\wordcount\\input"));//G:\\wordcount\\input為文件所存放的路徑 FileOutputFormat.setOutputPath(job,newPath("G:\\wordcount\\output"));//G:\\wordcount\\output為文件中單詞出現(xiàn)的次數(shù)。 //5、可以設(shè)置啟動的reduce數(shù)量 job.setNumReduceTasks(2); //6、提交job給YARN booleanres=job.waitForCompletion(true); System.exit(res?0:-1); }}Driver類的編寫上述代碼中,setJarByClass(WordCountJob.class)方法指定job調(diào)用的驅(qū)動類;setMapperClass(WordCountMapper.class)方法和setReducerClass(WordCountReducer.class)方法指定job調(diào)用的Mapper和Reducer實(shí)現(xiàn)類;setMapOutputKeyClass(Text.class)方法、setMapOutputValueClass(IntWritable.class)方法、setOutputKeyClass(Text.class)方法和setOutputValueClass(IntWritable.class)方法指定job調(diào)用的Mapper和Reducer實(shí)現(xiàn)類中key和value數(shù)據(jù)類型;FileInputFormat.setInputPath和FileOutputFormat.setOutputPath指定處理的數(shù)據(jù)和最終結(jié)果數(shù)據(jù)路徑;提交job給YARN。Driver類的編寫處理的數(shù)據(jù)來自于G:/wordcount/input文件夾,最終輸出結(jié)果位于G:/wordcount/output文件夾,運(yùn)行結(jié)果文件名如圖所示:Driver類的編寫在Windows10下運(yùn)行MapReduce程序,必須在Windows10操作系統(tǒng)上配置Hadoop的Hadoop_HOME和Path路徑。運(yùn)行結(jié)果如圖所示:課外拓展在上面代碼中,實(shí)現(xiàn)了本地測試功能,處理的數(shù)據(jù)來源本地,但是實(shí)際生產(chǎn)環(huán)境中,數(shù)據(jù)位于HDFS上,那么該如何解決?本地直接提交給集群運(yùn)行生成Jar包提交給YARN運(yùn)行課外拓展System.setProperty("HADOOP_USER_NAME","hadoop");Configurationconf=newConfiguration();//設(shè)置job運(yùn)行時(shí)要訪問的默認(rèn)文件系統(tǒng)conf.set("fs.defaultFS","hdfs://hdp-01:9000");Jobjob=Job.getInstance(conf);1.本地直接提交給集群,添加代碼如下:課外拓展除了需要增加上述代碼之外,還需要將處理的數(shù)據(jù)和最終結(jié)果數(shù)據(jù)路徑修改為HDFS上的位置,如下所示:FileInputFormat.setInputPaths(job,newPath("/wordcount/input"));FileOutputFormat.setOutputPath(job,newPath("/wordcount/output"));1.本地直接提交給集群,添加代碼如下:課外拓展該方式中,只需要將處理的數(shù)據(jù)和最終結(jié)果數(shù)據(jù)路徑修改為HDFS上的位置即可,然后打成Jar包提交給集群,詳細(xì)介紹在任務(wù)五中。2.打成Jar包直接提交給集群運(yùn)行:本節(jié)小結(jié)本節(jié)介紹編寫代碼實(shí)現(xiàn)單詞統(tǒng)計(jì)分析功能的Driver,相信大家對Driver代碼有了全新的認(rèn)識,為我們后續(xù)編寫MapReduce程序打下了堅(jiān)實(shí)的基礎(chǔ)。Hadoop大數(shù)據(jù)項(xiàng)目開發(fā)——
YARN概述目錄content02YARN功能01YARN簡介YARN簡介MapReduce1.0既是一個(gè)計(jì)算框架,也是一個(gè)資源管理調(diào)度框架YARN簡介YARN是一個(gè)純碎的資源管理調(diào)度框架,而不是一個(gè)計(jì)算框架.MapReduce1.0中的資源管理調(diào)度功能,被單獨(dú)剝離出來形成了YARN。Hadoop2.0以后YARN簡介被剝離了資源管理調(diào)度功能的MapReduce框架就變成了MapRedece2.0,它是運(yùn)行在YARN之上的一個(gè)純碎的計(jì)算框架,不再自己負(fù)責(zé)資源調(diào)度管理服務(wù),而是由YARN為其提供資源管理調(diào)度服務(wù)。YARN簡介YARN是一個(gè)純碎的資源調(diào)度框架。MapRedece2.0運(yùn)行在YARN之上的一個(gè)純碎的計(jì)算框架。YARN簡介YARN是一種新的Hadoop資源管理器;是一個(gè)通用資源管理系統(tǒng);可為上層應(yīng)用提供統(tǒng)一的資源管理和調(diào)度;為集群在利用率、資源統(tǒng)一管理和數(shù)據(jù)共享等方面帶來了好處。YARN功能ResourceManagerApplicationMasterNodeManagerYARN--ResourceManager的功能ResourceManager功能處理客戶端請求資源分配和調(diào)度監(jiān)控NodeManager啟動ApplicationMaster監(jiān)控ApplicationMasterYARN--ResourceManager的功能ResourceManager處理客戶端請求啟動pplicationaster負(fù)責(zé)接受來自ApplicationMaster的應(yīng)用程序資源請求,把集群中的資源以“容器”的形式分配給提出申請的應(yīng)用程序,容器的選擇通常會考慮應(yīng)用程序所要處理的數(shù)據(jù)的位置,進(jìn)行就近選擇從而實(shí)現(xiàn)“計(jì)算向數(shù)據(jù)靠攏”調(diào)度器應(yīng)用程序管理器負(fù)責(zé)管理整個(gè)系統(tǒng)中所有應(yīng)用程序,包括應(yīng)用程序提交、與調(diào)度器協(xié)商資源以啟動ApplicationMaster、監(jiān)控ApplicationMaster運(yùn)行狀態(tài)并在失敗時(shí)重新啟動它等。YARN--ResourceManager功能容器(container)作為動態(tài)資源分配單位,每個(gè)容器中都封裝了一定數(shù)量的CPU、內(nèi)存、磁盤等資源,從而限定每個(gè)應(yīng)用程序可以使用的資源量。YARN會為每個(gè)任務(wù)分配一個(gè)容器,且該任務(wù)只能使用該容器中封裝的資源。YARN--ApplicationMaster的功能ApplicationMaster為應(yīng)用程序申請資源,并分配給內(nèi)部任務(wù);功能2:任務(wù)調(diào)度、監(jiān)控和容錯(cuò)。功能1:YARN--NodeMaster的功能NodeMaster單個(gè)節(jié)點(diǎn)上的資源管理功能2:處理ResourceManger的命令。功能1:功能3:處理ApplicationMaster的命令。YARN功能YARN的資源管理和執(zhí)行框架都是按主/從范例實(shí)現(xiàn)的——Slave節(jié)點(diǎn)管理器(NM)運(yùn)行、監(jiān)控每個(gè)節(jié)點(diǎn),并向集群的Master資源管理器(RM)報(bào)告資源的可用性狀態(tài),資源管理器最終為系統(tǒng)里所有應(yīng)用分配資源。本章小結(jié)本節(jié)介紹YARN,相信大家對YARN和MapReduce程序提交給YARN運(yùn)行有了更深入的理解,為我們后續(xù)理解YARN打下了堅(jiān)實(shí)的基礎(chǔ)。Hadoop大數(shù)據(jù)項(xiàng)目開發(fā)——YARN安裝目錄content01YARN的安裝簡介02YARN的安裝0%100%YARN不需要單獨(dú)安裝只需要修改Hadoop中的配置文件YARN的安裝簡介YARN:資源調(diào)度平臺主要作用:資源管理作業(yè)調(diào)度兩個(gè)進(jìn)程:ResourceManagerNodeManagerYARN的安裝簡介YARN集群部署規(guī)劃如下所示:ResourceManager很消耗內(nèi)存,不要和NameNode、SecondaryNameNode配置在同一個(gè)節(jié)點(diǎn)上。節(jié)點(diǎn)masterslave1slave2HDFS節(jié)點(diǎn)NameNodeDataNodeSecondaryNameNodeDataNodeDataNodeYARN節(jié)點(diǎn)NodeManagerNodeManagerResourceManagerNodeManagerYARN的安裝簡介是Yarn平臺的主節(jié)點(diǎn);負(fù)責(zé)整個(gè)集群的所有資源的統(tǒng)一管理和調(diào)度;接收來自各個(gè)NodeManager節(jié)點(diǎn)的資源匯報(bào)信息;并把這些信息按照一定的策略分配給各個(gè)應(yīng)用程序。ResourManagerYARN的安裝簡介是Yarn平臺的從節(jié)點(diǎn);每個(gè)節(jié)點(diǎn)都會有自己的NodeManager;整個(gè)集群有多個(gè),負(fù)責(zé)每個(gè)節(jié)點(diǎn)上的資源和使用;負(fù)責(zé)接收處理來自ResourceManager的資源分配請求,分配具體的容器給應(yīng)用。NodeManagerYARN的安裝簡介步驟1:修改配置文件yarn-site.xml配置文件所在位置YARN的安裝修改core-site.xml配置文件內(nèi)容指定ResourceManager運(yùn)行在slave2節(jié)點(diǎn)YARN的安裝修改core-site.xml配置文件內(nèi)容需配置成mapreduce_shuffle,才可運(yùn)行MapReduce程序YARN的安裝YARN的安裝步驟2:拷貝yarn-site.xml到另外兩個(gè)節(jié)點(diǎn),執(zhí)行如下命令:步驟3:啟動YARN集群在slave2節(jié)點(diǎn)上啟動YARN集群,執(zhí)行啟動命令,執(zhí)行成功之后會出現(xiàn)以下內(nèi)容:YARN的安裝步驟4:在三個(gè)節(jié)點(diǎn)上執(zhí)行jps命令master節(jié)點(diǎn)salve1的節(jié)點(diǎn)salve2的節(jié)點(diǎn)YARN的安裝步驟5:節(jié)點(diǎn)啟動成功,通過http://slave2:8088訪問Web界面,通過瀏覽器監(jiān)測YARN的運(yùn)行狀態(tài)salve2的節(jié)點(diǎn)YARN的安裝本章小結(jié)本節(jié)介紹YARN的安裝,相信大家對YARN有了更深入的理解,為我們后續(xù)理解將MapReduce程序提交給YARN運(yùn)行打下了堅(jiān)實(shí)的基礎(chǔ)。Hadoop大數(shù)據(jù)項(xiàng)目開發(fā)——MapReduce程序提交給YARN運(yùn)行目錄content0201MapRedcue配置Maven生成jar包03執(zhí)行jar包MapRedcue配置TWITTERYUTUBESKYPEFACEBOOK
MapReduce程序運(yùn)行在Yarn上;YARN作為一個(gè)資源調(diào)度平臺;更好的運(yùn)用集群上的資源。很好的調(diào)度MapReduce任務(wù);1234MapRedcue配置將MapReduce程序提交給YARN運(yùn)行MapRedcue的配置文件/usr/local/src/hadoop/etc/hadoop需要修改:位于:MapRedcue配置步驟1:修改配置文件將mapred-site.xml.template重命名為mapred-site.xml參數(shù)指定MapReduce使用YARN資源管理器。步驟2:mapred-site.xml配置文件內(nèi)容:MapRedcue配置在mapred-site.xml的<configuration>和</configuration>標(biāo)簽中添加如下內(nèi)容:在mapred-site.xml的<configuration>和</configuration>標(biāo)簽中添加如下內(nèi)容:MapRedcue配置步驟3:拷貝整個(gè)mapred-site.xml到slave1和slave2兩個(gè)節(jié)點(diǎn)YARN一個(gè)分布式操作系統(tǒng)平臺相當(dāng)于MapReduce應(yīng)用程序相當(dāng)于Maven生成jar包WordCount程序提交集群運(yùn)行輸入路徑:FileInputFormat.setInputPaths(job,newPath("/wordcount/input"));輸出路徑:FileOutputFormat.setOutputPath(job,newPath("/wordcount/output"));在WordCount程序的源代碼中,需要修改數(shù)據(jù)的輸入路徑和輸出路徑,其余內(nèi)容不變,代碼如下所示:打包Maven生成jar包步驟1步驟2步驟3步驟4Maven生成jar包步驟5步驟6執(zhí)行jar包步驟1:使用Xshell的文件傳輸功能,將已經(jīng)生成的wordcount.jar包傳到master節(jié)點(diǎn)上的根目錄下的usr目錄下local目錄下的src目錄下。執(zhí)行jar包步驟2:在HDFS上創(chuàng)建wordcount目錄,首先查看hdfs根目錄上是否有wordcount目錄:hadoopfs-ls/如果輸出的結(jié)果沒有wordcount目錄,則創(chuàng)建此目錄,執(zhí)行命令:hadoopfs-mkdir/wordcount
執(zhí)行jar包master節(jié)點(diǎn)步驟3:執(zhí)行jar包,命令如下所示:hadoopjar命令執(zhí)行過程如下圖所示:執(zhí)行jar包Web界面對應(yīng)的執(zhí)行結(jié)果步驟4:hadoopjar命令執(zhí)行完成之后,計(jì)算結(jié)果保存到了HDFS上,如圖所示:執(zhí)行jar包_SUCCESS_FAILED沒有內(nèi)容、執(zhí)行成功執(zhí)行失敗Part-r-00000Part-r-00001MapReduce執(zhí)行分析數(shù)據(jù)后的結(jié)果文件,兩個(gè)文件表示MapReduce啟動了兩個(gè)Reducer任務(wù),一個(gè)Reducer任務(wù)輸出一個(gè)文件。保存結(jié)果文件執(zhí)行jar包查看計(jì)算結(jié)果步驟5:使用如下命令查看運(yùn)行結(jié)果:本章小結(jié)本節(jié)介紹MapReduce程序提交給YARN運(yùn)行,相信大家對MapReduce程序提交給YARN運(yùn)行有了更深入的理解,為我們后續(xù)理解大數(shù)據(jù)分析計(jì)算打下了堅(jiān)實(shí)的基礎(chǔ)。Hadoop大數(shù)據(jù)項(xiàng)目開發(fā)——MapReduce性能調(diào)優(yōu)目錄content02MapReduce優(yōu)化方法01MapReduce運(yùn)行效率瓶頸MapReduce運(yùn)行效率瓶頸運(yùn)行效率哪些因素影響MapReduce運(yùn)行效率瓶頸1.數(shù)據(jù)傾斜并行處理的數(shù)據(jù)集中,某一部分的數(shù)據(jù)顯著多于其它部分。使得該部分的處理速度成為整個(gè)數(shù)據(jù)集處理的瓶頸。MapReduce運(yùn)行效率瓶頸2.Map和Reduce數(shù)量設(shè)置不合理100M0.8默認(rèn)緩沖區(qū)大小默認(rèn)溢出的百分比1默認(rèn)Reduce任務(wù)數(shù)量MapReduce運(yùn)行效率瓶頸3.Map運(yùn)行時(shí)間太長,導(dǎo)致Reduce等待過久使Map運(yùn)行到一定程度后,Reduce也開始運(yùn)行,減少Reduce的等待時(shí)間。MapReduce運(yùn)行效率瓶頸4.小文件過多當(dāng)輸入的是大量的小文件時(shí),會啟動大量的MapTask;一方面大量占用NameNode的內(nèi)存空間,另一方面索引文件過大使得索引速度變慢MapReduce運(yùn)行效率瓶頸5.大量不可分塊的超大文件源文件無法分塊;導(dǎo)致需要通過網(wǎng)絡(luò)IO從其他節(jié)點(diǎn)讀取文件塊,IO開銷較大。不可分塊超大文件MapReduce運(yùn)行效率瓶頸6.Spill次數(shù)過多當(dāng)Map產(chǎn)生的數(shù)據(jù)非常大時(shí),如果默認(rèn)的Buffer大小不夠;會進(jìn)行非常多次的Spill,進(jìn)行Spill就意味著要寫磁盤,產(chǎn)生IO開銷。10Merge默認(rèn)處理Spill數(shù)量MapReduce運(yùn)行效率瓶頸7.merge次數(shù)過多Spill非常多,Merge階段每次只能處理10個(gè)Spill,造成頻繁的IO處理;調(diào)大并行處理的Spill數(shù)減少M(fèi)erge次數(shù),但是如果調(diào)整的數(shù)值過大,并行處理Spill的過程過多會對節(jié)點(diǎn)造成很大壓力。MapReduce優(yōu)化方法1、數(shù)據(jù)輸入優(yōu)化合并小文件大量的小文件會產(chǎn)生大量的裝載任務(wù),增大Map任務(wù)裝載次數(shù)。CombineTextinputFormat采用這個(gè)類作為輸入,解決輸入端大量小文件場景。CombineInputFormat使用這個(gè)類自定義分片策略,對小文件進(jìn)行合并處理從而減少M(fèi)apTask的數(shù)量。MapReduce優(yōu)化方法2、Map階段優(yōu)化減少溢寫次數(shù)100M默認(rèn)緩沖區(qū)大小200M增大到200M減少磁盤的IO操作。減少合并次數(shù)10個(gè)文件20個(gè)文件減少歸并的次數(shù)在map之后,先進(jìn)行Combine處理,減少IO操作。MapReduce優(yōu)化方法合理設(shè)置Reduce端的Buffer3、Reduce階段優(yōu)化合理設(shè)置Reduce數(shù)量設(shè)置Map、Reduce共存Map運(yùn)行到一定程度后,Reduce也開始運(yùn)行,減少Reduce的等待時(shí)間。保證reduce可以直接從buffer中拿一部分?jǐn)?shù)據(jù)MapReduce優(yōu)化方法4、I/O傳輸優(yōu)化采用數(shù)據(jù)壓縮的方式,減少網(wǎng)絡(luò)IO的時(shí)間Snappy速度快,系統(tǒng)自帶LZO壓縮編碼器速度快,支持切片MapReduce優(yōu)化方法5、數(shù)據(jù)傾斜優(yōu)化某一個(gè)區(qū)域的數(shù)據(jù)量遠(yuǎn)遠(yuǎn)大于其他區(qū)域,如何減少數(shù)據(jù)數(shù)據(jù)傾斜:1.抽樣和范圍分區(qū)通過對原始數(shù)據(jù)進(jìn)行抽樣得到的結(jié)果來預(yù)設(shè)分區(qū)邊界值;2.自定義分區(qū)數(shù)據(jù)量大的進(jìn)行分區(qū)處理;01020304傾斜優(yōu)化3.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 10 的認(rèn)識和加減(教學(xué)設(shè)計(jì))-2024-2025學(xué)年一年級上冊數(shù)學(xué)冀教版
- 2024-2025學(xué)年高中化學(xué) 第1章 第2節(jié) 課時(shí)3 物質(zhì)的量在化學(xué)實(shí)驗(yàn)中的應(yīng)用教學(xué)實(shí)錄 新人教版必修1
- 工作規(guī)范簡明教程
- 2 我愛我們的祖國(教學(xué)設(shè)計(jì))-2024-2025學(xué)年統(tǒng)編版(2024)語文一年級上冊
- 三農(nóng)村基層組織協(xié)調(diào)利益關(guān)系實(shí)現(xiàn)機(jī)制研究
- 6 我參與我奉獻(xiàn) 第2課時(shí) 教學(xué)設(shè)計(jì)-2023-2024學(xué)年道德與法治五年級下冊統(tǒng)編版
- 某醫(yī)院污水處理站工程設(shè)計(jì)范本
- 中心糧庫建設(shè)項(xiàng)目可行性研究
- 4 身體的“總指揮”(教學(xué)設(shè)計(jì))2024-2025學(xué)年科學(xué)五年級上冊 - 教科版
- 11 變廢為寶有妙招(教學(xué)設(shè)計(jì))-2024-2025學(xué)年統(tǒng)編版道德與法治四年級上冊
- 2024解析:第五章透鏡及其應(yīng)用-講核心(解析版)
- 《國家的空間特征》課件
- 常見麻醉方法及其護(hù)理
- GB/T 5527-2024動植物油脂折光指數(shù)的測定
- 地?zé)崮芾眉夹g(shù)的原理與應(yīng)用考核試卷
- 古代詩歌鑒賞-評價(jià)詩歌思想內(nèi)容和觀點(diǎn)態(tài)度
- 經(jīng)顱磁刺激的臨床應(yīng)用
- 《機(jī)器人驅(qū)動與運(yùn)動控制》全套教學(xué)課件
- 2024年《315消費(fèi)者權(quán)益保護(hù)法》知識競賽題庫及答案
- 新能源汽車概論課件 2.1認(rèn)知新能源汽車動力電池技術(shù)
- 公司委托公司委托書
評論
0/150
提交評論