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