重慶企業(yè)網(wǎng)站建設(shè)報(bào)價(jià)十大最靠譜培訓(xùn)機(jī)構(gòu)
MapReduce 的 Shuffle 過(guò)程指的是 MapTask 的后半程,以及ReduceTask的前半程,共同組成的。
從 MapTask 中的 map 方法結(jié)束,到 ReduceTask 中的 reduce 方法開(kāi)始,這個(gè)中間的部分就是Shuffle。是MapReduce的核心,心臟。
map端:
1、map中的context.write方法,對(duì)外寫(xiě)出的時(shí)候,其實(shí)是寫(xiě)入到了一個(gè)環(huán)形緩沖區(qū)內(nèi)(內(nèi)存形式的),這個(gè)環(huán)形緩沖區(qū)大小是100M,可以通過(guò)參數(shù)設(shè)置。如果里面的數(shù)據(jù)大于80M,就開(kāi)始溢寫(xiě)(從內(nèi)存中將數(shù)據(jù)寫(xiě)入到磁盤(pán)上)。溢寫(xiě)的文件存放地址可以設(shè)置。
2、在溢寫(xiě)過(guò)程中,環(huán)形緩沖區(qū)不會(huì)停止工作,是會(huì)利用剩余的20%繼續(xù)存入環(huán)形緩沖區(qū)的。除非是環(huán)形緩沖區(qū)的內(nèi)存滿(mǎn)了,map任務(wù)就被阻塞了。
在溢寫(xiě)出來(lái)的文件中,是排過(guò)序的,排序規(guī)則:快速排序算法。在排序之前,會(huì)根據(jù)分區(qū)的算法,對(duì)數(shù)據(jù)進(jìn)行分區(qū)。在內(nèi)存中,先分區(qū),在每一個(gè)分區(qū)中再排序,接著溢寫(xiě)到磁盤(pán)上的。
3、溢寫(xiě)出來(lái)的小文件需要合并為一個(gè)大文件,因?yàn)槊恳粋€(gè)MapTask只能有一份數(shù)據(jù)。就將相同的分區(qū)文件合并,并且排序(此處是歸并排序)。每次合并的時(shí)候是10個(gè)小文件合并為一個(gè)大文件,進(jìn)行多次合并,最終每一個(gè)分區(qū)的文件只能有一份。
假如100個(gè)小文件,需要合并幾次呢?
100 ?每10分合并一次,第一輪:100個(gè)文件合并為了10個(gè)文件,這10個(gè)文件又合并為一個(gè)大文件,總共合并了11次。
4、將內(nèi)存中的數(shù)據(jù),溢寫(xiě)到磁盤(pán)上,還可以指定是否需要壓縮,以及壓縮的算法是什么。
reduce端:?
1、reduce端根據(jù)不同的分區(qū),拉取每個(gè)服務(wù)器上的相同的分區(qū)的數(shù)據(jù)。
reduce任務(wù)有少量復(fù)制線(xiàn)程,因此能夠并行取得map輸出。默認(rèn)值是5個(gè)線(xiàn)程,但這個(gè)默認(rèn)值可以修改,設(shè)置mapreduce.reduce.shuffle. parallelcopies 屬性即可。
2、如果map上的數(shù)據(jù)非常的小,該數(shù)據(jù)會(huì)拉取到reduce端的內(nèi)存中,如果數(shù)據(jù)量比較大,直接拉取到reduce端的硬盤(pán)上。