MapReduce是一個編程模型,也是一個處理和生成超大數(shù)據(jù)集的算法模型的相關(guān)實(shí)現(xiàn)。用戶首先創(chuàng)建一個Map函數(shù)處理一個基于key/value pair的數(shù)據(jù)集合,輸出中間的基于key/value pair的數(shù)據(jù)集合;然后再創(chuàng)建一個Reduce函數(shù)用來合并所有的具有相同中間key值的中間value值。 MapReduce架構(gòu)的程序能夠在大量的普通配置的計(jì)算機(jī)上實(shí)現(xiàn)并行化處理。這個系統(tǒng)在運(yùn)行時(shí)只關(guān)心:如何分割輸入數(shù)據(jù),在大量計(jì)算機(jī)組成的集群上的調(diào)度,集群中計(jì)算機(jī)的錯誤處理,管理集群中計(jì)算機(jī)之間必要的通信。采用MapReduce架構(gòu)可以使那些沒有并行計(jì)算和分布式處理系統(tǒng)的開發(fā)經(jīng)驗(yàn)的程序員有效利用分布式系統(tǒng)的豐富資源。 大多數(shù)運(yùn)算都包含這樣的操作:在輸入數(shù)據(jù)的“邏輯”記錄上應(yīng)用Map操作得出一個中間key/value pair集合,然后在所有具有相同key值的value值上應(yīng)用Reduce操作,從而達(dá)到合并中間的數(shù)據(jù),得到一個想要的結(jié)果的目的。使用MapReduce模型,再結(jié)合用戶實(shí)現(xiàn)的Map和Reduce函數(shù),我們就可以非常容易的實(shí)現(xiàn)大規(guī)模并行化計(jì)算;通過MapReduce模型自帶的“再次執(zhí)行”(re-execution)功能,也提供了初級的容災(zāi)實(shí)現(xiàn)方案。 編程模型 MapReduce編程模型的原理是:利用一個輸入key/value pair集合來產(chǎn)生一個輸出的key/value pair集合。MapReduce庫的用戶用兩個函數(shù)表達(dá)這個計(jì)算:Map和Reduce。 用戶自定義的Map函數(shù)接受一個輸入key/value pair值,然后產(chǎn)生一個中間key/value pair值的集合。MapReduce庫把所有具有相同中間key值I的中間value值集合在一起后傳遞給reduce函數(shù)。 用戶自定義的Reduce函數(shù)接受一個中間key值的I和相關(guān)的一個value值的集合。Reduce函數(shù)合并這些value值,形成一個較小的value值的集合。一般的,每次Reduce函數(shù)調(diào)用只產(chǎn)生0或1個輸出value值。通常我們通過一個迭代器把中間value值提供給Reduce函數(shù),這樣我們就可以處理無法全部放入內(nèi)存中的大量的value值的集合。 實(shí)現(xiàn) MapReduce模型可以有多種不同的實(shí)現(xiàn)方式。如何正確選擇取決于具體的環(huán)境。例如,一種實(shí)現(xiàn)方式適用于小型的共享內(nèi)存方式的機(jī)器,另外一種實(shí)現(xiàn)方式則適用于大型NUMA架構(gòu)的多處理器的主機(jī),而有的實(shí)現(xiàn)方式更適合大型的網(wǎng)絡(luò)連接集群。 執(zhí)行概括 通過將Map調(diào)用的輸入數(shù)據(jù)自動分割為M個數(shù)據(jù)片段的集合,Map調(diào)用被分布到多臺機(jī)器上執(zhí)行。輸入的數(shù)據(jù)片段能夠在不同的機(jī)器上并行處理。使用分區(qū)函數(shù)將Map調(diào)用產(chǎn)生的中間key值分成R個不同分區(qū),Reduce調(diào)用也被分布到多臺機(jī)器上執(zhí)行。分區(qū)數(shù)量(R)和分區(qū)函數(shù)由用戶來指定。 |
|