本篇內(nèi)容介紹了“Shuffle的洗牌過程是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
10年積累的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)制作后付款的網(wǎng)站建設(shè)流程,更有荊門免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
Shuffle的正常意思是洗牌或弄亂
Shuffle描述著數(shù)據(jù)從map task輸出到reduce task輸入的這段過程。.
大部分map task與reduce task的執(zhí)行是在不同的節(jié)點(diǎn)上。當(dāng)然很多情況下Reduce執(zhí)行時(shí)需要跨節(jié)點(diǎn)去拉取其它節(jié)點(diǎn)上的map task結(jié)果。
我們對(duì)Shuffle過程的期望可以有:
完整地從map task端拉取數(shù)據(jù)到reduce 端。在跨節(jié)點(diǎn)拉取數(shù)據(jù)時(shí),盡可能減少對(duì)帶寬的不必要消耗。減少磁盤IO對(duì)task執(zhí)行的影響。
Shuffle解釋
每個(gè)map task都有一個(gè)內(nèi)存緩沖區(qū),存儲(chǔ)著map的輸出結(jié)果,當(dāng)緩沖區(qū)快滿的時(shí)候需要將緩沖區(qū)的數(shù)據(jù)以一個(gè)臨時(shí)文件的方式存放到磁盤,當(dāng)整個(gè)map task結(jié)束后再對(duì)磁盤中這個(gè)map task產(chǎn)生的所有臨時(shí)文件做合并,生成最終的正式輸出文件,然后等待reduce task來拉數(shù)據(jù)。
1、在map task執(zhí)行時(shí),它的輸入數(shù)據(jù)來源于HDFS的block,當(dāng)然在MapReduce概念中,map task只讀取split。Split與block的對(duì)應(yīng)關(guān)系可能是多對(duì)一,默認(rèn)是一對(duì)一。
2、在經(jīng)過mapper類的運(yùn)行后,我們得知mapper的輸出是這樣一個(gè)k/v鍵值
對(duì)。在這只做統(tǒng)計(jì),reduce才做合并。
3.Partitioner接口,它的作用就是根據(jù)key或value及reduce的數(shù)量來決定當(dāng)前的這對(duì)輸出數(shù)據(jù)最終應(yīng)該交由哪個(gè)reduce task處理。默認(rèn)對(duì)key hash后再以reduce task數(shù)量取模。默認(rèn)的取模方式只是為了平均reduce的處理能力,如果用戶自己對(duì)Partitioner有需求,可以訂制并設(shè)置到j(luò)ob.set(..)。
4(Memory Buffer)接下來我們將數(shù)據(jù)寫入到內(nèi)存緩沖區(qū)中,緩沖區(qū)的作用是批量收集map結(jié)果,減少磁盤IO的影響。我們的key/value對(duì)以及Partition的結(jié)果都會(huì)被寫入緩沖區(qū)。當(dāng)然寫入之前,key與value值都會(huì)被序列化成字節(jié)數(shù)組。
5內(nèi)存緩沖區(qū)是有大小限制的,默認(rèn)是100MB。當(dāng)map task 的輸出結(jié)果大于這個(gè)內(nèi)存緩沖區(qū)的閥值是(buffer size * spill percent = 100MB * 0.8 = 80MB)
溢寫線程啟動(dòng),把這80M在緩沖區(qū)的數(shù)據(jù)寫入到磁盤中,Map task向剩下20MB在內(nèi)存中,互補(bǔ)影響。這個(gè)從內(nèi)存往磁盤寫數(shù)據(jù)的過程被稱為Spill
當(dāng)溢寫線程啟動(dòng)后,需要對(duì)這80MB空間內(nèi)的key做排序(Sort)。排序是MapReduce模型默認(rèn)的行為,這里的排序也是對(duì)序列化的字節(jié)做的排序。
圖上也可以看到寫到磁盤中的溢寫文件是對(duì)不同的reduce端的數(shù)值做過合并。所以溢寫過程一個(gè)很重要的細(xì)節(jié)在于,如果有很多個(gè)key/value 對(duì)需要發(fā)送到某個(gè)reduce端去,那么需要將這些key/value值拼接到一塊,減少與partition相關(guān)的索引記錄。
6.如果client設(shè)置過Combiner,那么現(xiàn)在就是使用Combiner的時(shí)候了。將有相同key的key/value對(duì)的value加起來,減少溢 寫到磁盤的數(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類型完全一致,且不影響最終結(jié)果的場(chǎng)景。比如累加,最大值等。Combiner的使用一定 得慎重,如果用好,它對(duì)job執(zhí)行效率有幫助,反之會(huì)影響reduce的最終結(jié)果。
7.每次溢寫會(huì)在磁盤上產(chǎn)生一個(gè)溢寫文件,Map 輸出結(jié)果很大時(shí),會(huì)有多次這樣的溢寫文件到磁盤上,當(dāng) Map task 結(jié)束完成時(shí),內(nèi)存緩沖區(qū)的數(shù)據(jù)同樣也會(huì)溢寫到磁盤上,結(jié)果磁盤會(huì)有一個(gè)或多個(gè)溢出的文件,同時(shí)合并溢出的文件。(如果map輸出的結(jié)果很少,map完成時(shí),溢出的文件只有一個(gè))合并這個(gè)過程就叫做Merge{墨跡}
merge是將多個(gè)溢寫文件合并到一個(gè)文件,所以可能也有相同的key存在,在這個(gè)過程中如果client設(shè)置過Combiner,也會(huì)使用Combiner來合并相同的key。
此時(shí),map端的工作都已結(jié)束,最終生成的文件也存放在Task Tracker本地目錄內(nèi),每個(gè)reduce task 不斷的通過RPC 從JOBTracker哪里獲取 map task 是否完成,如果reduce task 得到通知,通知到某臺(tái)Task Tracker 上的map task執(zhí)行完成,shuffle的reducece開始拉去map Task完成的數(shù)據(jù)
Reducer真正運(yùn)行之前,所有的時(shí)間都是在拉取數(shù)據(jù),做merge,且不斷重復(fù)地在做。如前面的方式一樣,分段地描述reduce 端的Shuffle細(xì)節(jié)
1.copy 過程,就是拉取數(shù)據(jù)。Reduce進(jìn)程啟動(dòng)一些copy線程,通過Http方式請(qǐng)求 map task 所在的TaskTracker獲取map task的輸出文件。應(yīng)為map task 已經(jīng)結(jié)束,這文件就歸TaskTracker管理了,管理在本地磁盤中。
2.copy過來的數(shù)據(jù)會(huì)先儲(chǔ)存在內(nèi)存緩沖區(qū)中(Memory Buffer),這里的緩沖區(qū)要比map端的更加靈活,它基于JVM的heap size 的設(shè)置,因?yàn)閟huffle階段rduce不運(yùn)行,所以把大部分的內(nèi)存給shuffle來用,
這里和map中內(nèi)存溢出一樣,當(dāng)內(nèi)存中的數(shù)據(jù)達(dá)到一定的閥值,就會(huì)啟動(dòng)內(nèi)存到磁盤的溢出....合并Merge 。這個(gè)過程我們?cè)O(shè)置Combiner,也會(huì)啟用的,然后在磁盤中生成很多一些文件。值到map端沒有數(shù)據(jù)才結(jié)束。然后啟動(dòng)第三種磁盤到磁盤的merge方式生成最終的那個(gè)文件。
3.Reduce的輸入文件,不斷的合并后(merge),最后會(huì)生成一個(gè)“最終文件”,這個(gè)文件可能存在磁盤上也能在內(nèi)存中(內(nèi)存需要設(shè)置并且優(yōu)化),默認(rèn)在磁盤中,當(dāng)Reducer的輸入文件已定,整個(gè)Shuffle才最終結(jié)束。然后就是Reducer執(zhí)行,把結(jié)果放到HDFS上。
“Shuffle的洗牌過程是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!