MapReduce是Google提出的一個(gè)軟件架構(gòu),用于大規(guī)模數(shù)據(jù)集(大于1TB)的并行運(yùn)算。概念"Map(映射)"和"Reduce(化簡)",和他們的主要思想,都是從函數(shù)式編程語言借來的,還有從矢量編程語言借來的特性。
當(dāng)前的軟件實(shí)現(xiàn)是指定一個(gè)Map(映射)函數(shù),用來把一組鍵值對映射成一組新的鍵值對,指定并發(fā)的Reduce(化簡)函數(shù),用來保證所有映射的鍵值對中的每一個(gè)共享相同的鍵組。
映射和化簡
簡單說來,一個(gè)映射函數(shù)就是對一些獨(dú)立元素組成的概念上的列表(例如,一個(gè)測試成績的列表)的每一個(gè)元素進(jìn)行指定的操作(比如前面的例子里,有人發(fā)現(xiàn)所有學(xué)生的成績都被高估了一分,他可以定義一個(gè)“減一”的映射函數(shù),用來修正這個(gè)錯(cuò)誤。)。事實(shí)上,每個(gè)元素都是被獨(dú)立操作的,而原始列表沒有被更改,因?yàn)檫@里創(chuàng)建了一個(gè)新的列表來保存新的答案。這就是說,Map操作是可以高度并行的,這對高性能要求的應(yīng)用以及并行計(jì)算領(lǐng)域的需求非常有用。
而化簡操作指的是對一個(gè)列表的元素進(jìn)行適當(dāng)?shù)暮喜ⅲɡ^續(xù)看前面的例子,如果有人想知道班級的平均分該怎么做?他可以定義一個(gè)化簡函數(shù),通過讓列表中的元素跟自己的相鄰的元素相加的方式把列表減半,如此遞歸運(yùn)算直到列表只剩下一個(gè)元素,然后用這個(gè)元素除以人數(shù),就得到了平均分)。雖然他不如映射函數(shù)那么并行,但是因?yàn)榛喛偸怯幸粋€(gè)簡單的答案,大規(guī)模的運(yùn)算相對獨(dú)立,所以化簡函數(shù)在高度并行環(huán)境下也很有用。
分布和可靠性
MapReduce通過把對數(shù)據(jù)集的大規(guī)模操作分發(fā)給網(wǎng)絡(luò)上的每個(gè)節(jié)點(diǎn)實(shí)現(xiàn)可靠性;每個(gè)節(jié)點(diǎn)會(huì)周期性的把完成的工作和狀態(tài)的更新報(bào)告回來。如果一個(gè)節(jié)點(diǎn)保持沉默超過一個(gè)預(yù)設(shè)的時(shí)間間隔,主節(jié)點(diǎn)(類同Google檔案系統(tǒng)中的主服務(wù)器)記錄下這個(gè)節(jié)點(diǎn)狀態(tài)為死亡,并把分配給這個(gè)節(jié)點(diǎn)的數(shù)據(jù)發(fā)到別的節(jié)點(diǎn)。每個(gè)操作使用命名文件的原子操作以確保不會(huì)發(fā)生并行線程間的沖突;當(dāng)文件被改名的時(shí)候,系統(tǒng)可能會(huì)把他們復(fù)制到任務(wù)名以外的另一個(gè)名字上去。(避免副作用)。
化簡操作工作方式很類似,但是由于化簡操作在并行能力較差,主節(jié)點(diǎn)會(huì)盡量把化簡操作調(diào)度在一個(gè)節(jié)點(diǎn)上,或者離需要操作的數(shù)據(jù)盡可能近的節(jié)點(diǎn)上了;這個(gè)特性可以滿足Google的需求,因?yàn)樗麄冇凶銐虻膸挘麄兊膬?nèi)部網(wǎng)絡(luò)沒有那么多的機(jī)器。
用途
在Google,MapReduce用在非常廣泛的應(yīng)用程序中,包括“分布grep,分布排序,web連接圖反轉(zhuǎn),每臺機(jī)器的詞矢量,web訪問日志分析,反向索引構(gòu)建,文檔聚類,機(jī)器學(xué)習(xí),基于統(tǒng)計(jì)的機(jī)器翻譯……”值得注意的是,MapReduce實(shí)現(xiàn)以后,它被用來重新生成Google的整個(gè)索引,并取代老的ad hoc程序去更新索引。
MapReduce會(huì)生成大量的臨時(shí)文件,為了提高效率,它利用Google檔案系統(tǒng)來管理和訪問這些文件。
其他實(shí)現(xiàn)
- Hadoop - Apache軟件基金會(huì)的開放源碼項(xiàng)目,提供與MapReduce檔案系統(tǒng)類似的功能。