本篇內(nèi)容介紹了“Hadoop和spark為何要對(duì)key進(jìn)行排序”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)專(zhuān)業(yè)為企業(yè)提供山陽(yáng)網(wǎng)站建設(shè)、山陽(yáng)做網(wǎng)站、山陽(yáng)網(wǎng)站設(shè)計(jì)、山陽(yáng)網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、山陽(yáng)企業(yè)網(wǎng)站模板建站服務(wù),十余年山陽(yáng)做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
只要對(duì)hadoop
中mapreduce
的原理清楚的都熟知下面的整個(gè)流程運(yùn)行原理,其中涉及到至少三次排序,分別是溢寫(xiě)快速排序,溢寫(xiě)歸并排序,reduce
拉取歸并排序,而且排序是默認(rèn)的,即天然排序的,那么為什么要這么做的,設(shè)計(jì)原因是什么。先給個(gè)結(jié)論,為了整體更穩(wěn)定,輸出滿(mǎn)足多數(shù)需求,前者體現(xiàn)在不是采用hashShuffle
而是sortShuffle
,后者體現(xiàn)在預(yù)計(jì)算,要知道排序后的數(shù)據(jù),在后續(xù)數(shù)據(jù)使用時(shí)的會(huì)方便很多,比如體現(xiàn)索引的地方,如reduce
拉取數(shù)據(jù)時(shí)候。
在分析設(shè)計(jì)原因之前,先理解一下整個(gè)過(guò)程,在map
階段,根據(jù)預(yù)先定義的partition
規(guī)則進(jìn)行分區(qū),map
首先將輸出寫(xiě)到緩存中,當(dāng)緩存內(nèi)容達(dá)到閾值時(shí),將結(jié)果spill
到硬盤(pán),每一次spill
都會(huì)在硬盤(pán)產(chǎn)生一個(gè)spill
文件,因此一個(gè)map task可能會(huì)產(chǎn)生多個(gè)spill
文件,其中在每次spill
的時(shí)候會(huì)對(duì)key
進(jìn)行排序。接下來(lái)進(jìn)入shuffle
階段,當(dāng)map
寫(xiě)出最后一個(gè)輸出,需要在map
端進(jìn)行一次merge
操作,按照partition
和partition
內(nèi)的key
進(jìn)行歸并排序(合并+排序),此時(shí)每個(gè)partition
內(nèi)按照key
值整體有序。然后開(kāi)始第二次merge
,這次是在reduce
端,在此期間數(shù)據(jù)在內(nèi)存和磁盤(pán)上都有,其實(shí)這個(gè)階段的merge
并不是嚴(yán)格意義上的排序,也是跟前面類(lèi)似的合并+排序,只是將多個(gè)整體有序的文件merge
成一個(gè)大的文件,最終完成排序工作。分析完整個(gè)過(guò)程后,是不是覺(jué)得如果自己實(shí)現(xiàn)MapReduce
框架的話,考慮用HashMap
輸出map內(nèi)容即可。
整個(gè)流程圖如下:
詳細(xì)步驟:
首先,讀取數(shù)據(jù)組件InputFormat
(默認(rèn)TextInputFormat
)會(huì)通過(guò)getSplits
方法對(duì)輸?入?目錄中文件進(jìn)行邏輯切?片規(guī)劃得到splits
,有多少個(gè)split
就對(duì)應(yīng)啟動(dòng)多少個(gè)MapTask
。split
與block
的對(duì)應(yīng)關(guān)系默認(rèn)是?對(duì)?。
將輸入文件切分為splits
之后,由RecordReader
對(duì)象(默認(rèn)LineRecordReader
)進(jìn)行讀取,以\n
作為分隔符,讀取?行數(shù)據(jù),返回<key,value>
。Key
表示每?行行?首字符偏移值,value
表示這?行文本內(nèi)容。
讀取split
返回<key,value>
,進(jìn)?入?用戶(hù)自己繼承的Mapper
類(lèi)中,執(zhí)行用戶(hù)重寫(xiě)的map
函數(shù)。RecordReader
讀取?行這里調(diào)用一次。
map
邏輯完之后,將map
的每條結(jié)果通過(guò)context.write
進(jìn)?行行collect
數(shù)據(jù)收集。在collect
中,會(huì)先對(duì)其進(jìn)行分區(qū)處理,默認(rèn)使用HashPartitioner
。MapReduce
提供Partitioner
接口,它的作用就是根據(jù)key
或value
及reduce
的數(shù)量來(lái)決定當(dāng)前的這對(duì)輸出數(shù)據(jù)最終應(yīng)該交由哪個(gè)reduce task
處理。默認(rèn)對(duì)key hash
后再以reduce task
數(shù)量量取模。默認(rèn)的取模方式只是為了平均reduce
的處理能力,如果用戶(hù)自己對(duì)Partitioner
有需求,可以訂制并設(shè)置到job
上。
接下來(lái),會(huì)將數(shù)據(jù)寫(xiě)入內(nèi)存,內(nèi)存中這?片區(qū)域叫做環(huán)形緩沖區(qū),緩沖區(qū)的作用是批量量收集map
結(jié)果,減少磁盤(pán)IO
的影響。我們的key/value
對(duì)以及Partition
的結(jié)果都會(huì)被寫(xiě)?入緩沖區(qū)。當(dāng)然寫(xiě)?入之前,key
與value
值都會(huì)被序列列化成字節(jié)數(shù)組
環(huán)形緩沖區(qū)其實(shí)是一個(gè)數(shù)組,數(shù)組中存放著key
、value
的序列化數(shù)據(jù)和key
、value
的元數(shù)據(jù)信息,包括partition
、key
的起始位置、value
的起始位置以及value
的長(zhǎng)度。環(huán)形結(jié)構(gòu)是一個(gè)抽象概念。
緩沖區(qū)是有大小限制,默認(rèn)是100MB
。當(dāng)map task
的輸出結(jié)果很多時(shí),就可能會(huì)撐爆內(nèi)存,所以需要在一定條件下將緩沖區(qū)中的數(shù)據(jù)臨時(shí)寫(xiě)?入磁盤(pán),然后重新利利?用這塊緩沖區(qū)。這個(gè)從內(nèi)存往磁盤(pán)寫(xiě)數(shù)據(jù)的過(guò)程被稱(chēng)為Spill
,中文可譯為溢寫(xiě)。這個(gè)溢寫(xiě)是由單獨(dú)線程來(lái)完成,不影響往緩沖區(qū)寫(xiě)map結(jié)果的線程。溢寫(xiě)線程啟動(dòng)時(shí)不不應(yīng)該阻?止
map的結(jié)果輸出,所以整個(gè)緩沖區(qū)有個(gè)溢寫(xiě)的?比例例spill.percent
。這個(gè)?比例例默認(rèn)是0.8
,也就是當(dāng)緩沖區(qū)的數(shù)據(jù)已經(jīng)達(dá)到閾值(buffer size * spillpercent = 100MB * 0.8 = 80MB)
,溢寫(xiě)線程啟動(dòng),鎖定這80MB
的內(nèi)存,執(zhí)行溢寫(xiě)過(guò)程Maptask
的輸出結(jié)果還可以往剩下的20MB
內(nèi)存中寫(xiě),互不不影響、
當(dāng)溢寫(xiě)線程啟動(dòng)后,需要對(duì)這80MB
空間內(nèi)的key
做排序(Sort
)。排序是MapReduce
模型默認(rèn)的?行行為!
如果job
設(shè)置過(guò)Combiner
,那么現(xiàn)在就是使?用Combiner
的時(shí)候了了。將有相同key
的key/value
對(duì)的value
加起來(lái),減少溢寫(xiě)到磁盤(pán)的數(shù)據(jù)量量。Combiner
會(huì)優(yōu)化MapReduce
的中間結(jié)果,所以它在整個(gè)模型中會(huì)多次使用。
那哪些場(chǎng)景才能使?用Combiner
呢?從這?里里分析,Combiner
的輸出是Reducer
的輸?,Combiner
絕不不能改變最終的計(jì)算結(jié)果。Combiner
只應(yīng)該?用于那種Reduce
的輸入key/value
與輸出key/value
類(lèi)型完全一致,且不不影響最終結(jié)果的場(chǎng)景。?比如累加,最?大值等。Combiner
的使?用一定得慎重如果用的好,它對(duì)job
執(zhí)?行行效率有幫助,反之會(huì)影響reduce
的最終結(jié)果
合并溢寫(xiě)文件:每次溢寫(xiě)會(huì)在磁盤(pán)上生成一個(gè)臨時(shí)文件(寫(xiě)之前判斷是否有combiner
),如果map
的輸出結(jié)果真的很大,有多次這樣的溢寫(xiě)發(fā)生,磁盤(pán)上相應(yīng)的就會(huì)有多個(gè)臨時(shí)文件存在。當(dāng)整個(gè)數(shù)據(jù)處理理結(jié)束之后開(kāi)始對(duì)磁盤(pán)中的臨時(shí)文件進(jìn)?行行merge
合并,因?yàn)樽罱K文件只有一個(gè),寫(xiě)?磁盤(pán),并且為這個(gè)文件提供了一個(gè)索文件,以記錄每個(gè)reduce
對(duì)應(yīng)數(shù)據(jù)的偏移量量。
Reduce
?大致分為copy
、sort
、reduce
三個(gè)階段,重點(diǎn)在前兩個(gè)階段。copy
階段包含?一個(gè) eventFetcher
來(lái)獲取已完成的map
列列表,由Fetcher線程去copy
數(shù)據(jù),在此過(guò)程中會(huì)啟動(dòng)兩個(gè)merge
線程,分別為inMemoryMerger
和onDiskMerger
,分別將內(nèi)存中的數(shù)據(jù)merge
到磁盤(pán)和將磁盤(pán)中的數(shù)據(jù)進(jìn)?merge
。待數(shù)據(jù)copy
完成之后,copy
階段就完成了,開(kāi)始進(jìn)?行行sort
階段,sort
階段主要是執(zhí)?finalMerge
操作,純粹的sort
階段,完成之后就是reduce
階段,調(diào)?用?用戶(hù)定義的reduce
函數(shù)進(jìn)?處理。 詳細(xì)步驟
簡(jiǎn)單地拉取數(shù)據(jù)。Reduce
進(jìn)程啟動(dòng)一些數(shù)據(jù)copy
線程(Fetcher
),通過(guò)HTTP
方式請(qǐng)求maptask
獲取屬于自己的文件。
Merge
階段。這?里里的merge
如map
端的merge
動(dòng)作,只是數(shù)組中存放的是不不同map
端copy
來(lái)的數(shù)值。Copy
過(guò)來(lái)的數(shù)據(jù)會(huì)先放入內(nèi)存緩沖區(qū)中,這?里里的緩沖區(qū)大小要?比map
端的更更為靈活。merge
有三種形式:內(nèi)存到內(nèi)存;內(nèi)存到磁盤(pán);磁盤(pán)到磁盤(pán)。默認(rèn)情況下第?一種形式不不啟?用。當(dāng)內(nèi)存中的數(shù)據(jù)量量到達(dá)一定閾值,就啟動(dòng)內(nèi)存到磁盤(pán)的merge
。與map
端類(lèi)似,這也是溢寫(xiě)的過(guò)程,這個(gè)過(guò)程中如果你設(shè)置有Combiner
,也是會(huì)啟?用的,然后在磁盤(pán)中生成了了眾多的溢寫(xiě)文件。第二種merge方式?一直在運(yùn)?行行,直到?jīng)]有map
端的數(shù)據(jù)時(shí)才結(jié)束,然后啟動(dòng)第三種磁盤(pán)到磁盤(pán)的merge
方式生成最終的文件。
把分散的數(shù)據(jù)合并成一個(gè)?大的數(shù)據(jù)后,還會(huì)再對(duì)合并后的數(shù)據(jù)排序。對(duì)排序后的鍵值對(duì)調(diào)?用reduce
方法,鍵相等的鍵值對(duì)調(diào)?用一次reduce
方法,每次調(diào)?用會(huì)產(chǎn)生零個(gè)或者多個(gè)鍵值對(duì),最后把這些輸出的鍵值對(duì)寫(xiě)入到HDFS
文件中。
“Hadoop和spark為何要對(duì)key進(jìn)行排序”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
本文題目:Hadoop和spark為何要對(duì)key進(jìn)行排序
本文URL:http://aaarwkj.com/article10/ispddo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、標(biāo)簽優(yōu)化、面包屑導(dǎo)航、企業(yè)建站、企業(yè)網(wǎng)站制作、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)