




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第五章
MapReduce計(jì)算框架大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.1
MapReduce簡介5.2
MapReduce的工作原理5.3
MapReduce編程組件5.4本章小結(jié)本章目錄大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.1MapReduce簡介大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.1MapReduce簡介MapReduce最早是由Google公司研究提出的一種面向大規(guī)模數(shù)據(jù)處理的并行計(jì)算模型和方法。MapReduce的推出給大數(shù)據(jù)并行處理帶來了巨大的革命性影響,使其已經(jīng)成為事實(shí)上的大數(shù)據(jù)處理的工業(yè)標(biāo)準(zhǔn)。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.1.1分布式并行編程為了更好地理解MapReduce相關(guān)內(nèi)容,首先主要介紹分布式并行編程的概念在過去很長一段時(shí)間內(nèi),CPU的性能都遵循“摩爾定律”,CPU的性能大約每隔18個(gè)月翻一番,這就意味著不需要對程序進(jìn)行改進(jìn),僅僅通過使用更高級的CPU就可以享受免費(fèi)的性能提升。從2005年開始,“摩爾定律”逐漸失效。人們開始借助分布式并行編程來提高程序的運(yùn)行性能。分布式程序運(yùn)行在大規(guī)模計(jì)算機(jī)集群上,集群中包括大量廉價(jià)服務(wù)器,可以并行執(zhí)行大規(guī)模數(shù)據(jù)處理任務(wù),從而獲得海量數(shù)據(jù)的計(jì)算能力。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.1.1分布式并行編程在MapReduce出現(xiàn)之前,已經(jīng)有非常成熟的并行計(jì)算框架了,那為什么Google還需要MapReduce?大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)對比方面?zhèn)鹘y(tǒng)并行計(jì)算框架MapReduce集群架構(gòu)/容錯(cuò)性共享式(共享內(nèi)存/共享存儲),容錯(cuò)性差非共享式,容錯(cuò)性好硬件/價(jià)格/擴(kuò)展性刀片服務(wù)器、高速網(wǎng)、SAN、價(jià)格高、擴(kuò)展性差普通計(jì)算機(jī)/便宜/擴(kuò)展性好編程/學(xué)習(xí)難度what-how、難what、簡單適用場景實(shí)時(shí)、細(xì)粒度計(jì)算、計(jì)算密集型批處理、非實(shí)時(shí)、數(shù)據(jù)密集型5.1.2MapReduce模型簡介MapReduce的核心思想就是“分而治之”,它把輸入的數(shù)據(jù)集切分為若干獨(dú)立的數(shù)據(jù)塊,分發(fā)給一個(gè)主節(jié)點(diǎn)管理下的各個(gè)分節(jié)點(diǎn)來共同并行完成,通過整合各個(gè)節(jié)點(diǎn)的中間結(jié)果得到最終結(jié)果。為了更好地理解“分而治之”的核心思想,先來看一個(gè)生活中的例子。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.1.2MapReduce模型簡介例如,某大型公司在全國設(shè)立了分公司,假設(shè)現(xiàn)在要統(tǒng)計(jì)公司一年的營收情況,制作年報(bào)。則有兩種統(tǒng)計(jì)方式:大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)第一種統(tǒng)計(jì)方式是各分公司將自己的賬單數(shù)據(jù)發(fā)送至總部,由總部統(tǒng)計(jì)公司一年的營收情況5.1.2MapReduce模型簡介這兩種統(tǒng)計(jì)方式相比,顯然第二種統(tǒng)計(jì)方式更好,工作效率更高。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)第二種統(tǒng)計(jì)方式是采用“分而治之”的思想,即先要求分公司各自統(tǒng)計(jì)一年的營收情況﹐再將統(tǒng)計(jì)結(jié)果發(fā)給總部進(jìn)行統(tǒng)一匯總計(jì)算。5.1.2MapReduce模型簡介MapReduce設(shè)計(jì)的一個(gè)理念就是“計(jì)算向數(shù)據(jù)靠攏”,而不是“數(shù)據(jù)向計(jì)算靠攏”,因?yàn)橐苿訑?shù)據(jù)需要大量的網(wǎng)絡(luò)傳輸開銷,尤其在大規(guī)模數(shù)據(jù)環(huán)境下,這種開銷尤為驚人。所以,移動計(jì)算要比移動數(shù)據(jù)更加經(jīng)濟(jì)。本著這個(gè)理念,在一個(gè)集群中,只要有可能,MapReduce框架就會將Map程序就近在HDFS數(shù)據(jù)所在的節(jié)點(diǎn)上運(yùn)行,即將計(jì)算節(jié)點(diǎn)和存儲節(jié)點(diǎn)放在一起運(yùn)行,從而減少節(jié)點(diǎn)間的數(shù)據(jù)移動開銷。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.1.3MapReduce的優(yōu)/缺點(diǎn)由于MapReduce具有編程簡單、擴(kuò)展性高、容錯(cuò)性高、海量數(shù)據(jù)處理能力強(qiáng)等特點(diǎn),所以它在大數(shù)據(jù)和人工智能時(shí)代十分受歡迎。雖然MapReduce具有很多優(yōu)點(diǎn),但它也有不適用的場景,即在有些場景下并不適合用MapReduce來處理問題。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.1.3MapReduce的優(yōu)/缺點(diǎn)MapReduce具有以下優(yōu)點(diǎn)。1.易于編程它簡單地實(shí)現(xiàn)一些接口,就可以完成一個(gè)分布式程序。這個(gè)分布式程序可以分布到大量廉價(jià)的計(jì)算機(jī)上運(yùn)行,因此MapReduce編程變得非常流行。2.良好的擴(kuò)展性當(dāng)計(jì)算資源不能得到滿足時(shí),可以通過簡單地增加機(jī)器來擴(kuò)展MapReduce的計(jì)算能力。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.1.3MapReduce的優(yōu)/缺點(diǎn)3.高容錯(cuò)性MapReduce設(shè)計(jì)的初衷就是使程序能夠部署在廉價(jià)的計(jì)算機(jī)上,這就要求它具有很高的容錯(cuò)性。例如,當(dāng)其中一臺機(jī)器出現(xiàn)故障時(shí),它可以把上面的計(jì)算任務(wù)轉(zhuǎn)移到另外一臺機(jī)器上運(yùn)行,不至于使這個(gè)任務(wù)運(yùn)行失敗,而且這個(gè)過程不需要人工參與,完全是由Hadoop內(nèi)部完成的。4.適合PB級以上海量數(shù)據(jù)的離線處理MapReduce適合PB級以上海量數(shù)據(jù)的離線處理,可以實(shí)現(xiàn)上千臺服務(wù)器集群并發(fā)工作,提供數(shù)據(jù)處理能力。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.1.3MapReduce的優(yōu)/缺點(diǎn)MapReduce的缺點(diǎn)表現(xiàn)在以下幾方面:1.不擅長進(jìn)行實(shí)時(shí)計(jì)算,MapReduce無法像MySQL一樣,在毫秒或秒級內(nèi)返回結(jié)果2.不擅長進(jìn)行流式計(jì)算,流式計(jì)算的輸入數(shù)據(jù)是動態(tài)的,而MapReduce的輸入數(shù)據(jù)集是靜態(tài)的,不能動態(tài)變化3.不擅長進(jìn)行DAG(有向無環(huán)圖)計(jì)算,多個(gè)應(yīng)用程序存在依賴關(guān)系,后一個(gè)應(yīng)用程序的輸入為前一個(gè)應(yīng)用程序的輸出,在這種情況下,每個(gè)MapReduce作業(yè)的輸出結(jié)果都會被寫入磁盤,會造成大量的磁盤I/O,導(dǎo)致數(shù)據(jù)處理程序性能非常低下。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.1.4Map和Reduce函數(shù)MapReduce模型的核心是Map和Reduce函數(shù),二者都是由應(yīng)用程序開發(fā)者負(fù)責(zé)具體實(shí)現(xiàn)的。程序員只需關(guān)注如何實(shí)現(xiàn)Map和Reduce函數(shù),而不需要處理并行編程中的其他各種復(fù)雜問題。Map和Reduce函數(shù)都是以<key,value>作為輸入的,并按一定的映射規(guī)則轉(zhuǎn)換成另一個(gè)或一批<key,value>進(jìn)行輸出。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)函數(shù)輸入輸出說明Map<k1,v1>List(<k2,v2>)將切片中的數(shù)據(jù)按照一定的規(guī)則解析成一批<key,value>,輸入Map函數(shù)中進(jìn)行處理。每個(gè)輸入的<k1,v1>都會輸出一批<k2,v2>,<k2,v2>是計(jì)算的中間結(jié)果Reduce<k2,List(v2)><k3,v3>List(v2)表示批屬于同一個(gè)k2的value5.2MapReduce的工作原理大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.1工作原理概述MapReduce的核心思想如所示,一個(gè)大的MapReduce作業(yè)首先會被拆分成許多個(gè)Map任務(wù)在多臺機(jī)器上并行執(zhí)行,每個(gè)Map任務(wù)通常運(yùn)行在數(shù)據(jù)存儲的節(jié)點(diǎn)上。這樣,計(jì)算和數(shù)據(jù)就可以放在一起運(yùn)行,而不需要額外的數(shù)據(jù)傳輸開銷。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.1工作原理概述當(dāng)Map任務(wù)執(zhí)行結(jié)束后,會生成以<key,value>形式表示的許多中間結(jié)果。這些中間結(jié)果會被分發(fā)到多個(gè)Reduce任務(wù)中,在多臺機(jī)器上并行執(zhí)行,具有相同key的<key,value>會被分發(fā)到同一個(gè)Reduce任務(wù)中,Reduce任務(wù)會對中間結(jié)果進(jìn)行匯總計(jì)算,從而得到最后結(jié)果,并輸出到分布式文件系統(tǒng)中。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.1工作原理概述在MapReduce的整個(gè)執(zhí)行過程中,Map任務(wù)的輸入文件、Reduce任務(wù)的處理結(jié)果都是保存在分布式文件系統(tǒng)中的,而Map任務(wù)處理得到的中間結(jié)果則保存在本地存儲空間中(如磁盤)。另外,只有當(dāng)Map任務(wù)全部處理結(jié)束后,Reduce過程才開始;只有Map任務(wù)需要考慮數(shù)據(jù)局部性,實(shí)現(xiàn)“計(jì)算向數(shù)據(jù)靠攏”,而Reduce任務(wù)則無須考慮數(shù)據(jù)局部性。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.2
MapReduce的工作過程MapReduce模型開發(fā)簡單且功能強(qiáng)大,專門為并行處理大規(guī)模數(shù)據(jù)而設(shè)計(jì)。下面結(jié)合下圖來描述MapReduce的工作過程。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.2MapReduce的工作過程①分片/格式化數(shù)據(jù)源分片操作是指將源文件劃分為大小相等的小數(shù)據(jù)塊,即分片(Split),Hadoop會為每個(gè)分片構(gòu)建一個(gè)Map任務(wù),并由該任務(wù)運(yùn)行自定義的map()函數(shù),從而處理分片中的每條記錄。格式化操作是指將劃分好的分片格式化形成為<key,value>的鍵值對數(shù)據(jù),其中,key代表偏移量,value代表每行的內(nèi)容。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.2MapReduce的工作過程②執(zhí)行Map任務(wù)每個(gè)Map任務(wù)都有一個(gè)內(nèi)存緩沖區(qū)(大小為100MB),處理后的中間結(jié)果會寫入緩沖區(qū)。當(dāng)寫入數(shù)據(jù)達(dá)到緩沖區(qū)閾值(80MB)時(shí),系統(tǒng)會將溢出數(shù)據(jù)寫入磁盤。在溢寫過程中,MapReduce框架對key進(jìn)行排序,可能會生成多個(gè)溢寫文件。最后,所有溢寫文件將被合并成一個(gè)文件。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.2MapReduce的工作過程③執(zhí)行Shuffle過程在MapReduce的工作過程中,Map階段處理的數(shù)據(jù)如何傳遞給Reduce階段是MapReduce框架中一個(gè)關(guān)鍵的過程,這個(gè)過程叫作Shuffle。Shuffle會將Map任務(wù)輸出的處理結(jié)果數(shù)據(jù)分發(fā)給Reduce任務(wù),并在分發(fā)的過程中對數(shù)據(jù)按key進(jìn)行分區(qū)和排序。關(guān)于Shuffle過程的具體機(jī)制,會在5.2.4節(jié)進(jìn)行講解。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.2MapReduce的工作過程④執(zhí)行Reduce任務(wù)輸入Reduce任務(wù)的數(shù)據(jù)流是<key,{valuelist}>形式,用戶可以自定義reduce()方法進(jìn)行邏輯處理,最終以<key,value>的形式輸出。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.2MapReduce的工作過程⑤寫入文件MapReduce框架會自動把Reduce任務(wù)生成的<key,value>傳入OutputFormat的write()方法,實(shí)現(xiàn)文件的寫入操作。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.3
Map任務(wù)工作原理Map任務(wù)作為MapReduce工作流程的前半部分,主要經(jīng)歷了5個(gè)階段,分別是Read階段、Map階段,Collect階段、Spill階段和Combine階段大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.3Map任務(wù)工作原理1.Read階段Read階段的主要任務(wù)是Map任務(wù)通過用戶編寫的RecordReader,從輸入的InputSplit中解析出一個(gè)個(gè)<key,value>。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.3Map任務(wù)工作原理2.Map階段在Map階段,解析出的<key,value>將交給用戶編寫的map()函數(shù)來處理,并產(chǎn)生一系列新的<key,value>。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.3Map任務(wù)工作原理3.Collect階段在用戶編寫的map()函數(shù)中,數(shù)據(jù)處理完成后一般會調(diào)用outputCollector.collect()輸出結(jié)果,在map函數(shù)內(nèi)部,通過調(diào)用5.3.4節(jié)介紹的partitioner組件生成<key,value>分片,并寫入一個(gè)環(huán)形內(nèi)存緩沖區(qū)。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.3Map任務(wù)工作原理4.Spill階段當(dāng)環(huán)形緩沖區(qū)滿后,MapReduce會將數(shù)據(jù)寫到本地磁盤上,生成一個(gè)臨時(shí)文件,這就是Spill階段。需要注意的是,在將數(shù)據(jù)寫入本地磁盤前,先要對數(shù)據(jù)進(jìn)行一次本地排序,并在必要時(shí)對數(shù)據(jù)進(jìn)行合并、壓縮等操作。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.3Map任務(wù)工作原理5.Combine階段當(dāng)所有數(shù)據(jù)處理完成以后,Map任務(wù)會對所有臨時(shí)文件進(jìn)行一次合并,以確保最終只會生成一個(gè)數(shù)據(jù)文件(output/file.out),同時(shí)生成相應(yīng)的索引文件(output/file.out.index)。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.4
Shuffle的工作原理Shuffle過程是對Map任務(wù)的輸出結(jié)果進(jìn)行分區(qū)、排序、合并等處理并交給Reduce任務(wù)的過程。Shuffle過程是MapReduce整個(gè)工作流程的核心環(huán)節(jié),理解Shuffle過程的基本原理對于理解MapReduce流程至關(guān)重要。Shuffle過程分為Map端的操作和Reduce端的操作。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.4Shuffle的工作原理Map端的Shuffle過程包括4個(gè)步驟:①輸入數(shù)據(jù)和執(zhí)行Map任務(wù)Map任務(wù)的輸入數(shù)據(jù)一般保存在分布式文件系統(tǒng)(如GFS或HDFS)的文件塊中,這些文件塊的格式是任意的,可以是文檔,也可以是二進(jìn)制格式的。Map任務(wù)接收<key,value>作為輸入后,按一定的映射規(guī)則轉(zhuǎn)換成一批<key,value>進(jìn)行輸出。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.4Shuffle的工作原理②寫入內(nèi)存緩沖區(qū)先在內(nèi)存緩沖區(qū)中積累一定數(shù)量的Map輸出結(jié)果,再一次性地批量寫入磁盤,這樣可以大大減小對磁盤I/O的影響。需要注意的是,在Map輸出結(jié)果寫入內(nèi)存緩沖區(qū)之前,key與value的值都會被序列化成字節(jié)數(shù)組。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.4Shuffle的工作原理③溢寫(分區(qū)、排序和合并)當(dāng)內(nèi)存緩沖區(qū)中數(shù)據(jù)達(dá)到一定比例(如0.8)時(shí),就需要進(jìn)行溢寫操作。溢寫操作是將內(nèi)存緩沖區(qū)中的內(nèi)容一次性寫入磁盤,并清空內(nèi)存緩沖區(qū)。在溢寫之前,內(nèi)存緩沖區(qū)中的數(shù)據(jù)需要進(jìn)行分區(qū)。對于每個(gè)分區(qū)內(nèi)的所有鍵值對,會進(jìn)行排序。在排序結(jié)束后,具有相同key的鍵值對進(jìn)行合并,這個(gè)操作可以減少需要溢寫至磁盤的數(shù)據(jù)量。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.4Shuffle的工作原理④文件歸并最終,在Map任務(wù)全部結(jié)束之前,系統(tǒng)會對所有溢寫文件中的數(shù)據(jù)進(jìn)行歸并,生成一個(gè)大的溢寫文件,這個(gè)大的溢寫文件中的所有鍵值對都是經(jīng)過分區(qū)和排序的。所謂歸并,就是指具有相同key的鍵值對會被歸并成一個(gè)新的鍵值對。具體而言,若干具有相同key的鍵值對<k1,v1>,<k1,v2>,…,<k1,vn>會被歸并成一個(gè)新的鍵值對<k1,<v1,v2,…,vn>>。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.4Shuffle的工作原理經(jīng)過上述4個(gè)步驟以后,Map端的Shuffle過程就全部完成了,最終生成的一個(gè)大的溢寫文件會被存放在本地磁盤上。這個(gè)大文件中的數(shù)據(jù)是被分區(qū)的,不同的分區(qū)會被發(fā)送到不同的Reduce任務(wù)進(jìn)行并行處理。JobTracker會一直監(jiān)測Map任務(wù)的執(zhí)行,當(dāng)監(jiān)測到一個(gè)Map任務(wù)完成后,就會立即通知相關(guān)的Reduce任務(wù)來領(lǐng)取數(shù)據(jù),并開始Reduce端的Shuffle過程。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.4Shuffle的工作原理Reduce端的Shuffle過程包括3個(gè)步驟①領(lǐng)取數(shù)據(jù)當(dāng)Map端的Shuffle過程結(jié)束后,Reduce任務(wù)需要從Map端獲取數(shù)據(jù)為了獲取數(shù)據(jù),每個(gè)Reduce任務(wù)會通過RPC向JobTracker詢問相應(yīng)的Map任務(wù)是否已經(jīng)完成。JobTracker會監(jiān)測Map任務(wù)的狀態(tài),一旦發(fā)現(xiàn)某個(gè)Map任務(wù)完成,就會通知相關(guān)的Reduce任務(wù)來領(lǐng)取對應(yīng)的數(shù)據(jù)。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.4Shuffle的工作原理②歸并數(shù)據(jù)當(dāng)所有的Map端數(shù)據(jù)都已經(jīng)被領(lǐng)回時(shí),與Map端類似,多個(gè)溢寫文件會被歸并成一個(gè)大文件,歸并時(shí)還會對鍵值對進(jìn)行排序,從而使得最終大的溢寫文件中的鍵值對都是有序的。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.4Shuffle的工作原理③把數(shù)據(jù)輸入給Reduce任務(wù)磁盤中經(jīng)過多輪歸并后得到的若干個(gè)大文件,不會繼續(xù)歸并成一個(gè)新的大文件,二十直接輸入給Reduce任務(wù),這樣可以減少磁盤讀寫開銷。由此,整個(gè)Shuffle過程順利結(jié)束。接下來,Reduce任務(wù)會執(zhí)行Recue函數(shù)中定義的各種映射,輸出最終結(jié)果,并保存到分布式文件系統(tǒng)中(比如GFS或HDFS)。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.5
Reduce任務(wù)的工作原理Reduce任務(wù)的工作過程主要經(jīng)歷了5個(gè)階段,分別是Copy階段、Merge階段,Sort階段、Reduce階段和Write階段大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.5Reduce任務(wù)的工作原理1.Copy階段Reduce會從各個(gè)Map任務(wù)上遠(yuǎn)程復(fù)制一個(gè)分片數(shù)據(jù),針對某一分片數(shù)據(jù),如果其大小超過一定閾值,則將其寫到磁盤上,否則直接將其放到內(nèi)存中。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.5Reduce任務(wù)的工作原理2.Merge階段在遠(yuǎn)程復(fù)制數(shù)據(jù)的同時(shí),Reduce任務(wù)會啟動兩個(gè)后臺線程,分別對內(nèi)存和磁盤上的文件進(jìn)行合并,以防止內(nèi)存使用過多或磁盤文件過多。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.5Reduce任務(wù)的工作原理3.Sort階段用戶編寫reduce()方法,輸入的是按key進(jìn)行聚集的一組數(shù)據(jù)。為了將key相同的數(shù)據(jù)聚在一起,Hadoop采用了基于排序的策略。由于各個(gè)Map任務(wù)已經(jīng)對自己的處理結(jié)果進(jìn)行了局部排序,因此,Reduce任務(wù)只需對所有數(shù)據(jù)進(jìn)行一次歸并排序即可。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.5Reduce任務(wù)的工作原理4.Reduce階段對排序后的鍵值對調(diào)用reduce()方法,key相等的鍵值對調(diào)用一次reduce()方法,每次調(diào)用會產(chǎn)生零個(gè)或多個(gè)鍵值對,最終把這些輸出的鍵值對寫到HDFS中。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.2.5Reduce任務(wù)的工作原理5.Write階段Reduce()函數(shù)將計(jì)算結(jié)果寫到HDFS上。注意:Reduce任務(wù)的數(shù)量和Map任務(wù)的數(shù)量不一樣,Reduce任務(wù)的數(shù)量可以手動指定,但是數(shù)量指定是有一定要求的。一般在默認(rèn)情況下,Reduce任務(wù)的數(shù)量應(yīng)該與Map任務(wù)中的Map階段和Collect階段寫出的分區(qū)數(shù)目對應(yīng)。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.3MapReduce編程組件大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.3
MapReduce編程組件我們可以借助MapReduce提供的一些編程組件來實(shí)現(xiàn)一個(gè)MapReduce程序,本節(jié)介紹MapReduce編程常見的組件:InputFormat組件、Mapper組件、Reducer組件、Partitioner組件、Combiner組件和OutputFormat組件。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.3.1InputFormat組件InputFormat組件主要用于描述輸入數(shù)據(jù)的格式,提供了兩個(gè)功能:一是數(shù)據(jù)切分,即按照某種策略將輸入數(shù)據(jù)切分成若干分片,以便確定Map任務(wù)的數(shù)量,即Mapper的數(shù)量,在MapReduce框架中,一個(gè)分片就意味著需要一個(gè)Map任務(wù);二是為Mapper提供輸入數(shù)據(jù),即給定一個(gè)分片,(使用其中的RecordReader對象)將其解析為一個(gè)個(gè)<key,value>鍵值對。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.3.1InputFormat組件HadoopMapReduce自帶了一些InputFormat的實(shí)現(xiàn)類,Hadoop提供的InputForamt的實(shí)現(xiàn)類層次圖如下圖:大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.3.1InputFormat組件下面看幾個(gè)具有代表性的InputFormat實(shí)現(xiàn)類。(1)FileInputFormat。FileInputFormat是一個(gè)抽象類,它最重要的功能是為各種InputFormat提供統(tǒng)一的getSplits()方法,該方法最核心的部分是文件切分算法和Host選擇算法。(2)TextInputFormat。在默認(rèn)情況下,MapReduce使用TextInputFormat類來讀分片并將記錄數(shù)據(jù)解析成一個(gè)個(gè)<key,value>。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.3.1InputFormat組件(3)CombineFileInputFormat。CombineFileInputFormat類的作用是把許多文件合并為一個(gè)Map的輸入。它的主要思路是把輸入目錄下的大文件分成多個(gè)Map任務(wù)的輸入,并合并小文件,作為一個(gè)Map任務(wù)的輸入。適合多個(gè)小文件的場景。(4)SequenceFileInputFormat。SequenceFileInputFormat是一個(gè)順序的二進(jìn)制的FileInputFormat,內(nèi)部以<key,value>的格式保存數(shù)據(jù),通常會結(jié)合LZO或Snappy壓縮算法來讀取或保存可分片的數(shù)據(jù)文件。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.3.2
Mapper組件MapReduce程序會根據(jù)輸入的文件產(chǎn)生多個(gè)Map任務(wù)。Hadoop提供的Mapper類是實(shí)現(xiàn)Map任務(wù)的一個(gè)抽象基類,該基類提供了一個(gè)map()方法。在默認(rèn)情況下,Mapper類中的map()方法是沒有做任何處理的。需要用戶根據(jù)具體的業(yè)務(wù)需求來自定義該方法的實(shí)現(xiàn)。用戶可以通過繼承Mapper類并重寫map()方法,來實(shí)現(xiàn)自己的數(shù)據(jù)處理邏輯。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.3.3
Reducer組件Map過程輸出的鍵值對將由Reducer組件進(jìn)行合并處理。Hadoop提供了幾種常見的Reducer的子類,這些類可以直接用于作業(yè)中。Reducer可以在org.apache.hadoop.mapreduce.lib.reduce包下面找到如下子類。(1)IntSumReducer:輸出每個(gè)key對應(yīng)的整數(shù)值列表的總和。(2)LongSumReducer:輸出每個(gè)key對應(yīng)的長整數(shù)值列表的總和。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.3.4
Partitioner組件Partitioner組件是負(fù)責(zé)將Map任務(wù)的輸出結(jié)果按照key進(jìn)行分區(qū)的組件。它的主要作用是確保具有相同key的數(shù)據(jù)被發(fā)送到同一個(gè)Reduce任務(wù)中。在MapReduce過程中,Map任務(wù)會將數(shù)據(jù)劃分為一組鍵值對(key-valuepairs),其中key表示數(shù)據(jù)的標(biāo)識或分類,而value則是實(shí)際的數(shù)據(jù)。Partitioner組件接收Map任務(wù)的輸出,并根據(jù)key對數(shù)據(jù)進(jìn)行分區(qū),以便后續(xù)的Reduce任務(wù)可以對具有相同key的數(shù)據(jù)進(jìn)行處理。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.3.4Partitioner組件如果想自定義一個(gè)Partitioner組件,則需要繼承Partitioner類并重寫getPartition()方法。在重寫getPartition()方法的過程中,通常的做法使用哈希函數(shù)對key進(jìn)行計(jì)算,得到一個(gè)唯一的哈希碼。然后,將哈希碼對Reduce任務(wù)個(gè)數(shù)取模。將哈希碼映射到一個(gè)特定的Reduce任務(wù)上,從而確定該鍵值對應(yīng)該被發(fā)送到哪個(gè)Reduce任務(wù)進(jìn)行處理。哈希函數(shù)通常會將不同的key映射到不同的哈希碼,并且哈希碼的分布也相對均勻。通過取模運(yùn)算,可以將不同的哈希碼分配給不同的Reduce任務(wù),從而使得數(shù)據(jù)能夠均勻地分布到各個(gè)Reduce任務(wù)上進(jìn)行并行處理。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.3.5
Combiner組件Combiner是MapReduce程序中Mapper和Reducer之外的一種組件。Combiner組件的作用就是對Map階段輸出的重復(fù)數(shù)據(jù)先做一次合并計(jì)算,然后把新的<key,value>作為Reduce階段的輸入。注意:Combiner組件的使用要非常謹(jǐn)慎:因?yàn)镃ombiner組件在MapReduce過程中可能被調(diào)用也可能不被調(diào)用,可能被調(diào)用一次也可能被調(diào)用多次,無法確定和控制。所以,Combiner使用的原則是:確保其使用對業(yè)務(wù)邏輯沒有影響,無論Combiner是否被調(diào)用或被調(diào)用多次,最終的結(jié)果應(yīng)該是一致的。而且,Combiner組件的輸出<key,value>應(yīng)該與Reducer的輸入<key,value>類型對應(yīng)。因?yàn)橛袝r(shí)如果使用Combiner組件不當(dāng),就會對統(tǒng)計(jì)結(jié)果造成錯(cuò)誤。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.3.5OutputFormat組件InputFormat描述的是MapReduce的輸入規(guī)范,而OutputFormat描述的是MapReduce的輸出規(guī)范。OutputFormat目的是設(shè)置MapReduce的作業(yè)輸出格式。下面介紹一些常見的OutputFormat實(shí)現(xiàn)類。(1)文本輸出TextOutputFormat。對于MapReduce任務(wù),其默認(rèn)的輸出格式是TextOutputFormat,它把每條記錄都寫為文本行。它的鍵和值可以為任意類型,因?yàn)門extOutputFormat調(diào)用toString()方法把記錄換為字符串。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.3.5OutputFormat組件(2)SequenceFileOutputFormat。SequenceFileOutputFormat將它的輸出寫為一個(gè)序列化文件,如果輸出需要作為后續(xù)MapReduce任務(wù)的輸入,這便是一種好的輸出格式,因?yàn)樗母袷骄o湊,很容易被壓縮。(3)自定義OutputFormat類。根據(jù)用戶需求,可以自定義OutputFormat類實(shí)現(xiàn)特定的輸出邏輯和格式要求。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.4MapReduce案例大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.4
MapReduce案例為了幫助讀者更好地學(xué)習(xí)和理解MapReduce計(jì)算框架,本節(jié)詳細(xì)介紹包括WordCount、倒排索引、數(shù)據(jù)去重和Top-N在內(nèi)的MapReduce案例。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.4.1MapReduce測試方式在正式開始介紹MapReduce案例前,先介紹MapReduce的兩種測試方式。1.本地測試本地測試需要在本地編寫程序并準(zhǔn)備本地輸入文件,通過配置Hadoop依賴的方式對編寫的程序進(jìn)行本地測試,在本地運(yùn)行主要是看MapReduce的業(yè)務(wù)邏輯是不是正確的。2.集群測試集群測試需要將編寫的程序打包上傳到集群中。這種測試方式更能模擬真實(shí)生產(chǎn)環(huán)境下的運(yùn)行方式。本地測試和集群測試不是非此即彼的,一般來說,一個(gè)MapReduce首先要經(jīng)過本地測試,然后進(jìn)行集群測試,只有這樣才能投入使用。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.4.2WordCount在編程語言的學(xué)習(xí)過程中,都會以“HelloWorld”程序作為入門范例,WordCount就是類似“HelloWorld”的MapReduce入門程序,WordCount程序任務(wù)如下表所示。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)項(xiàng)目描述程序WordCount輸入一個(gè)包含大量單詞的文本文件輸出文件中的每個(gè)單詞及其出現(xiàn)次數(shù)(頻數(shù)),并按照單詞字母順序排序,每個(gè)單詞及其頻數(shù)占一行,單詞和頻數(shù)之間有間隔5.4.2WordCount下表給出了一個(gè)WordCount程序的輸入和輸出實(shí)例。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)輸入輸出HelloWorldHelloHadoopHelloMapReduceHadoop1Hello3MapReduce1World15.4.2WordCount假設(shè)在執(zhí)行單詞統(tǒng)計(jì)任務(wù)的MapReduce作業(yè)中有3個(gè)執(zhí)行Map任務(wù)的Worker和1個(gè)執(zhí)行Reduce任務(wù)的Worker。一個(gè)文檔包含3行內(nèi)容,每行分配給一個(gè)Map任務(wù)來處理。Map操作的輸入是<key,value>形式。其中,key是文檔中某行的行號,value是該行的內(nèi)容。那么Map操作會將輸入文檔中的每個(gè)單詞都以<key,value>的形式作為中間結(jié)果進(jìn)行輸出。Map操作如右圖大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.4.2WordCount在Map端的Shuffle過程中,如果用戶沒有定義Combiner()函數(shù),則Shuffle過程會把具有相同key的鍵值對歸并成一個(gè)鍵值對,這些歸并后的鍵值對會作為Reduce任務(wù)的輸入,由Reduce任務(wù)為每個(gè)單詞計(jì)算出其總的出現(xiàn)頻數(shù)。用戶沒有定義Combiner()函數(shù)時(shí)的Reduce過程如右圖。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.4.2WordCount在實(shí)際應(yīng)用中,每個(gè)輸入文件被Map()函數(shù)解析后,都可能會生成大量類似<“the”,1>這樣的中間結(jié)果,顯然,這會大大增加網(wǎng)絡(luò)傳輸開銷。對于這種情形,MapReduce支持用戶提供Combiner()函數(shù)來對中間結(jié)果進(jìn)行合并后發(fā)送給Reduce任務(wù)。自定義Combiner()函數(shù)后的Reduce過程如右圖。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.4.3倒排索引倒排索引(InvertedIndex)是文檔檢索系統(tǒng)中最常用的數(shù)據(jù)結(jié)構(gòu),廣泛應(yīng)用于全文搜索引擎。倒排索引主要用來存儲某個(gè)單詞(或詞組)在一組文檔中的存儲位置的映射,提供了可以根據(jù)內(nèi)容查找文檔的方式,而不是根據(jù)文檔來確定內(nèi)容,因此稱為倒排索引。帶有倒排索引的文件稱為倒排索引文件,簡稱倒排文件(InvertedFile)。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.4.3倒排索引通常情況下,倒排文件由一個(gè)單詞(或詞組)和相關(guān)聯(lián)的文檔列表組成,如圖所示??梢钥闯觯⒌古潘饕哪康氖强梢愿臃奖愕厮阉?。例如,單詞1出現(xiàn)文檔1、文檔4文檔13等文檔中,單詞2出現(xiàn)在文檔2、文檔6,文檔10等文檔中,單詞3出現(xiàn)在文檔3、文檔7等文檔中。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.4.3倒排索引現(xiàn)假設(shè)有3個(gè)源文件filel.txt、file2.txt和file3.txt,需要對這3個(gè)源文件內(nèi)容實(shí)現(xiàn)倒排索引,并將最后的倒排文件輸出,整個(gè)過程要求實(shí)現(xiàn)如圖所示的轉(zhuǎn)換。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.4.3倒排索引首先使用默認(rèn)的TextInputFormat類對每個(gè)輸入文件進(jìn)行處理,得到文本中每行的偏移量及其內(nèi)容。Map階段首先分析輸入的<key,value>,經(jīng)過處理可以得到倒排索引中需要的3個(gè)信息:單詞、文檔名稱和詞頻。對輸入文件進(jìn)行處理的過程如圖所示。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.4.3倒排索引經(jīng)過Map階段的數(shù)據(jù)轉(zhuǎn)換后,同一個(gè)文檔中相同的單詞會出現(xiàn)多個(gè)的情況,而單純依靠后續(xù)Reduce階段無法同時(shí)完成詞頻統(tǒng)計(jì)和生成文檔列表兩項(xiàng)任務(wù),因此必須增加一個(gè)Combine階段,先完成每個(gè)文檔的詞頻統(tǒng)計(jì)。Combine階段如圖所示。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.4.3倒排索引經(jīng)過上述兩個(gè)階段的處理后,Reduce階段只需將所有文件中具有相同key的value進(jìn)行統(tǒng)計(jì),并組合成倒排索引文件所需的格式即可,組合過程如圖所示。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.4.4數(shù)據(jù)去重?cái)?shù)據(jù)去重主要是為了掌握利用并行化思想,對數(shù)據(jù)進(jìn)行有意義的篩選。數(shù)據(jù)去重是去除重復(fù)數(shù)據(jù)的操作。在大數(shù)據(jù)開發(fā)中,對于統(tǒng)計(jì)大數(shù)據(jù)集上的多種數(shù)據(jù)指標(biāo)這些復(fù)雜的任務(wù),都會涉及數(shù)據(jù)去重。大數(shù)據(jù)理論與應(yīng)用基礎(chǔ)5.4.4數(shù)據(jù)去重現(xiàn)假設(shè)有數(shù)據(jù)文件file1.txt和file2.txt,內(nèi)容如下。filel.txt本身包含重復(fù)數(shù)據(jù),并且與file2.tx
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度工程結(jié)清協(xié)議范本:市政基礎(chǔ)設(shè)施項(xiàng)目款項(xiàng)結(jié)算及驗(yàn)收協(xié)議
- 二零二五年度電子產(chǎn)品委托收款協(xié)議
- 《物流系統(tǒng)分析》課件 第五章-4 了解物流園區(qū)規(guī)劃的技術(shù)流程
- 2025年西安從業(yè)資格證模擬考試題貨運(yùn)考題
- 2025年四平貨車叢業(yè)資格證考試題
- 2024年技術(shù)開發(fā)合同
- 《轉(zhuǎn)動的摩天輪》幼兒園小學(xué)少兒美術(shù)教育繪畫課件創(chuàng)意教程教案
- 高中家長會 贏在未來苦在當(dāng)下課件-高三上學(xué)期家長會
- 高中家長會 攜手共育,靜待花開課件高三家長會
- 班會學(xué)生發(fā)言稿
- 小學(xué)德育校本課程教材-文本資料
- 南方全站儀NTS-332R說明書
- 2023湖南文藝出版社五年級音樂下冊全冊教案
- 100道公安基礎(chǔ)知識題目訓(xùn)練含答案
- 人教版小學(xué)數(shù)學(xué)一年級下冊課件:《找規(guī)律》獲獎(jiǎng)?wù)n件(34張)
- 合租合同模板電子版
- 全鏈條防范和打擊代孕工作機(jī)制研究
- 胃腸鏡健康宣教胃腸鏡檢查注意事項(xiàng)適應(yīng)癥與禁忌癥宣傳課件
- 教育科學(xué)研究方法(小學(xué)教育專業(yè))全套教學(xué)課件
- 《孔乙己》跨學(xué)科教學(xué)設(shè)計(jì) 2023-2024學(xué)年部編版語文九年級下冊
- 2024-2030年中國射頻集成電路(RFIC)行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報(bào)告
評論
0/150
提交評論