怎么做中英文版網(wǎng)站國(guó)內(nèi)搜索引擎排名
一、Map過(guò)程解析
- Read階段:MapTask通過(guò)用戶編寫的RecordReader,從輸入的InputSplit中解析出一個(gè)個(gè)key/value。
- Map階段:將解析出的key/value交給用戶編寫的Map()函數(shù)處理,并產(chǎn)生一系列的key/value。
- Collect階段:在用戶編寫的map()函數(shù)中,數(shù)據(jù)處理完成后,一般會(huì)調(diào)用outputCollector.collect()輸出結(jié)果,在該函數(shù)內(nèi)部,它會(huì)將生成的key/value分片(通過(guò)調(diào)用partitioner),并寫入一個(gè)環(huán)形緩沖區(qū)(該環(huán)形緩沖區(qū)的大小為100M)
- ?Spill階段:即”溢寫“,當(dāng)緩沖區(qū)快要溢出時(shí)(默認(rèn)達(dá)到緩沖區(qū)大小的80%),會(huì)在本地文件系統(tǒng)創(chuàng)建一個(gè)溢寫文件,將該緩沖區(qū)的數(shù)據(jù)寫入到這個(gè)文件。
- Combine階段:當(dāng)所有的數(shù)據(jù)處理完成以后,MapTask會(huì)對(duì)所有臨時(shí)文件進(jìn)行一次合并,以確保最終只會(huì)生成一個(gè)數(shù)據(jù)文件。
?將數(shù)據(jù)寫入本地磁盤前,先要對(duì)數(shù)據(jù)進(jìn)行一次本地排序,并在必要時(shí)對(duì)數(shù)據(jù)進(jìn)行合并、壓縮等操作。
寫入磁盤之前,線程會(huì)根據(jù) ReduceTask 的數(shù)量,將數(shù)據(jù)分區(qū),一個(gè) Reduce 任務(wù)對(duì)應(yīng)一個(gè)分區(qū)的數(shù)據(jù)。
這樣做的目的是為了避免有些 Reduce 任務(wù)分配到大量數(shù)據(jù),而有些 Reduce 任務(wù)分到很少的數(shù)據(jù),甚至沒(méi)有分到數(shù)據(jù)的尷尬局面。
如果此時(shí)設(shè)置了 Combiner ,將排序后的結(jié)果進(jìn)行 Combine 操作,這樣做的目的是盡可能少地執(zhí)行數(shù)據(jù)寫入磁盤的操作。
二、ReduceTask
?
- Copy階段:Reduce會(huì)從各個(gè)MapTask上遠(yuǎn)程復(fù)制一片數(shù)據(jù)(每個(gè)MapTask傳來(lái)的數(shù)據(jù)都是有序的),并針對(duì)某一片數(shù)據(jù),如果其大小超過(guò)一定閾值,則寫到磁盤上,否則直接放到內(nèi)存中;
- Merge階段:在遠(yuǎn)程復(fù)制數(shù)據(jù)的同時(shí),ReduceTask會(huì)啟動(dòng)兩個(gè)后臺(tái)進(jìn)程,分別對(duì)內(nèi)存和磁盤上的文件進(jìn)行合并,以防止內(nèi)存使用過(guò)多或者磁盤文件過(guò)多;
- Sort階段:用戶編寫reduce()方法,輸入數(shù)據(jù)是按key進(jìn)行聚集的一組數(shù)據(jù)
- Reduce階段:對(duì)排序后的鍵值對(duì)調(diào)用reduce()方法,鍵相等的鍵值對(duì)調(diào)用一次reduce()方法,每次調(diào)用會(huì)長(zhǎng)生零個(gè)或者多個(gè)鍵值對(duì),最后把這些輸出的鍵值對(duì)褻瀆到hdfs上;
- Write階段:reduce()函數(shù)將計(jì)算結(jié)果寫到HDFS上。?