欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Hadoop和spark為何要對(duì)key進(jìn)行排序

本篇內(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ù)。

1.思考

只要對(duì)hadoopmapreduce的原理清楚的都熟知下面的整個(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í)候。

Hadoop和spark為何要對(duì)key進(jìn)行排序

2.MapReduce原理分析

在分析設(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操作,按照partitionpartition內(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)容即可。

2.1 MapTask運(yùn)行機(jī)制詳解

整個(gè)流程圖如下:

Hadoop和spark為何要對(duì)key進(jìn)行排序

詳細(xì)步驟:

  1. 首先,讀取數(shù)據(jù)組件InputFormat(默認(rèn)TextInputFormat)會(huì)通過(guò)getSplits方法對(duì)輸?入?目錄中文件進(jìn)行邏輯切?片規(guī)劃得到splits,有多少個(gè)split就對(duì)應(yīng)啟動(dòng)多少個(gè)MapTask。splitblock的對(duì)應(yīng)關(guān)系默認(rèn)是?對(duì)?。

  2. 將輸入文件切分為splits之后,由RecordReader對(duì)象(默認(rèn)LineRecordReader)進(jìn)行讀取,以\n作為分隔符,讀取?行數(shù)據(jù),返回<key,value>Key表示每?行行?首字符偏移值,value表示這?行文本內(nèi)容。

  3. 讀取split返回<key,value>,進(jìn)?入?用戶(hù)自己繼承的Mapper類(lèi)中,執(zhí)行用戶(hù)重寫(xiě)的map函數(shù)。RecordReader讀取?行這里調(diào)用一次。

  4. map邏輯完之后,將map的每條結(jié)果通過(guò)context.write進(jìn)?行行collect數(shù)據(jù)收集。在collect中,會(huì)先對(duì)其進(jìn)行分區(qū)處理,默認(rèn)使用HashPartitioner。MapReduce提供Partitioner接口,它的作用就是根據(jù)keyvaluereduce的數(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上。

  5. 接下來(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ě)?入之前,keyvalue值都會(huì)被序列列化成字節(jié)數(shù)組

    • 環(huán)形緩沖區(qū)其實(shí)是一個(gè)數(shù)組,數(shù)組中存放著keyvalue的序列化數(shù)據(jù)和key、value的元數(shù)據(jù)信息,包括partitionkey的起始位置、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ě),互不不影響、

  6. 當(dāng)溢寫(xiě)線程啟動(dòng)后,需要對(duì)這80MB空間內(nèi)的key做排序(Sort)。排序是MapReduce模型默認(rèn)的?行行為!

    • 如果job設(shè)置過(guò)Combiner,那么現(xiàn)在就是使?用Combiner的時(shí)候了了。將有相同keykey/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é)果

  7. 合并溢寫(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ù)的偏移量量。

2.2 ReduceTask運(yùn)行機(jī)制詳解

Hadoop和spark為何要對(duì)key進(jìn)行排序

Reduce?大致分為copy、sortreduce三個(gè)階段,重點(diǎn)在前兩個(gè)階段。copy階段包含?一個(gè) eventFetcher來(lái)獲取已完成的map列列表,由Fetcher線程去copy數(shù)據(jù),在此過(guò)程中會(huì)啟動(dòng)兩個(gè)merge線程,分別為inMemoryMergeronDiskMerger,分別將內(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ì)步驟

2.2.1 Copy階段

簡(jiǎn)單地拉取數(shù)據(jù)。Reduce進(jìn)程啟動(dòng)一些數(shù)據(jù)copy線程(Fetcher),通過(guò)HTTP方式請(qǐng)求maptask獲取屬于自己的文件。

2.2.2 Merge階段

Merge階段。這?里里的mergemap端的merge動(dòng)作,只是數(shù)組中存放的是不不同mapcopy來(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方式生成最終的文件。

2.2.3 合并排序

把分散的數(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ùn)營(yíng)
亚洲国产熟女一区二区三| av中文资源在线观看| 91午夜福利视频在线观看| 亚洲av网站女性向在线观看| 亚洲字幕中文在线乱码mv| 高清av中文免费在线| 日韩国产亚洲欧美国产| av熟女乱一区二区三区| 成人精品播放视频在线观看| av一区二区三区高潮| 免费看真人性生活视频| 国产乡下三级_三级全黄| 日韩不卡永久免费视频观看| 91福利免费在线看| 亚洲三区四区视频在线观看| 成人精品亚洲一区二区| 国产亚洲美女在线视频视频| 中文字幕的国产在线播放| 久久亚洲综合色一区二区三区| 免费看夫妻性生活视频| 精品国产18禁99久久久久久| 999久久久久亚洲精品| 日本黄色免费在线观看网站| 欧美日韩黄片免费在线观看| 后入蜜桃臀美女在线观看| 亚洲国产成人精品福利| 久久人妻一区二区三区免费密臀| 日本美女阴部毛茸茸视频| 亚洲最大成人综合福利网| 日韩久久这里只有精品视频| 日韩高清在线亚洲专区不卡| 精品人妻一区二区三区| 亚洲欧美日韩不卡视频| 亚洲精品av一区二区久久 | 人人妻人人澡人人爽精品日本| 亚洲精品精品一区二区| 欧美护士激情第一欧美精品 | 午夜精品人妻一区二区| 自由成熟性生活免费视频| 蜜桃视频中文字幕二区三区| 四虎在线免费视频播放|