MapReduce

MapReduce

編程模型
MapReduce是一種編程模型,用于大規模數據集(大于1TB)的并行運算。概念"Map(映射)"和"Reduce(化簡)",和他們的主要思想,都是從函數式編程語言裡借來的,還有從矢量編程語言裡借來的特性。他極大地方便了編程人員在不會分布式并行編程的情況下,将自己的程序運行在分布式系統上。當前的軟件實現是指定一個Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,指定并發的Reduce(化簡)函數,用來保證所有映射的鍵值對中的每一個共享相同的鍵組。
    中文名:映射規約 外文名:MapReduce 别名:

概述

MapReduce是Google開發的C++編程工具,用于大規模數據集(大于1TB)的并行運算。概念"Map(映射)"和"Reduce(化簡)",和他們的主要思想,都是從函數式編程語言裡借來的,還有從矢量編程語言裡借來的特性。

當前的軟件實現是指定一個Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,指定并發的Reduce(化簡)函數,用來保證所有映射的鍵值對中的每一個共享相同的鍵組。

映射和化簡

mapReduce從字面上來理解就是兩個過程:map映射以及reduce化簡。是一種比較先進的大數據處理方法,其難度不高,從性能上來說屬于比較暴力的(通過N台服務器同時來計算),但相較于group以及aggregate來說,功能更強大,并更加靈活。nn映射過程:先把某一類數據分組歸類,這裡的映射過程是支持分布式的,一邊遍曆每一台服務器,一邊進行分類。

n化簡過程:然後再在分組中進行運算,這裡的化簡過程也是支持分布式的,在分類的過程中直接運算了。也就是說如果是一個求和的過程,先在a服務器分組求和,然後再在b服務器分組求和····最後再把化簡以後的數據進行最終處理。在映射化簡的過程都是每台服務器自己的CPU在運算,大量的服務器同時來進行運算工作,這就是大數據基本理念。

批處理模式

批處理模式是一種最早進行大規模數據處理的模式。批處理主要操作大規模靜态數據集,并在整體數據處理完畢後返回結果。批處理非常适合需要訪問整個數據集合才能完成的計算工作。

n傳統的程序基本是以單指令、單數據流的方式按順序執行的。這種程序開發起來比較簡單,符合人們的思維習慣,但是性能會受到單台計算機的性能的限制,很難在給定的時間内完成任務。

n而分布式并行程序運行在大量計算機組成的集群上,可以同時利用多台計算機并發完成同一個數據處理任務,提高了處理效率,同時,可以通過增加新的計算機擴充集群的計算能力。

nGoogle最先實現了分布式并行處理模式MapReduce,并于2004年以論文的方式對外公布了其工作原理,HadoopMapReduce是它的開源實現。HadoopMapReduce運行在HDFS上。

分布和可靠性

MapReduce通過把對數據集的大規模操作分發給網絡上的每個節點實現可靠性;每個節點會周期性的把完成的工作和狀态的更新報告回來。如果一個節點保持沉默超過一個預設的時間間隔,主節點(類同GoogleFileSystem中的主服務器)記錄下這個節點狀态為死亡,并把分配給這個節點的數據發到别的節點。每個操作使用命名文件的原子操作以确保不會發生并行線程間的沖突;當文件被改名的時候,系統可能會把他們複制到任務名以外的另一個名字上去(避免副作用)。

化簡操作工作方式很類似,但是由于化簡操作在并行能力較差,主節點會盡量把化簡操作調度在一個節點上,或者離需要操作的數據盡可能進的節點上了;這個特性可以滿足Google的需求,因為他們有足夠的帶寬,他們的内部網絡沒有那麼多的機器。

用途

在Google,MapReduce用在非常廣泛的應用程序中,包括“分布grep,分布排序,web連接圖反轉,每台機器的詞矢量,web訪問日志分析,反向索引構建,文檔聚類,機器學習,基于統計的機器翻譯,,,”值得注意的是,MapReduce實現以後,它被用來重新生成Google的整個索引,并取代老的adhoc程序去更新索引。

MapReduce會生成大量的臨時文件,為了提高效率,它利用Google文件系統來管理和訪問這些文件。

主要功能

MapReduce提供了以下的主要功能:

1)數據劃分和計算任務調度:

系統自動将一個作業(Job)待處理的大數據劃分為很多個數據塊,每個數據塊對應于一個計算任務(Task),并自動調度計算節點來處理相應的數據塊。作業和任務調度功能主要負責分配和調度計算節點(Map節點或Reduce節點),同時負責監控這些節點的執行狀态,并負責Map節點執行的同步控制。

2)數據/代碼互定位:

為了減少數據通信,一個基本原則是本地化數據處理,即一個計算節點盡可能處理其本地磁盤上所分布存儲的數據,這實現了代碼向數據的遷移;當無法進行這種本地化數據處理時,再尋找其他可用節點并将數據從網絡上傳送給該節點(數據向代碼遷移),但将盡可能從數據所在的本地機架上尋找可用節點以減少通信延遲。

3)系統優化:

為了減少數據通信開銷,中間結果數據進入Reduce節點前會進行一定的合并處理;一個Reduce節點所處理的數據可能會來自多個Map節點,為了避免Reduce計算階段發生數據相關性,Map節點輸出的中間結果需使用一定的策略進行适當的劃分處理,保證相關性數據發送到同一個Reduce節點;此外,系統還進行一些計算性能優化處理,如對最慢的計算任務采用多備份執行、選最快完成者作為結果。

4)出錯檢測和恢複:

以低端商用服務器構成的大規模MapReduce計算集群中,節點硬件(主機、磁盤、内存等)出錯和軟件出錯是常态,因此MapReduce需要能檢測并隔離出錯節點,并調度分配新的節點接管出錯節點的計算任務。同時,系統還将維護數據存儲的可靠性,用多備份冗餘存儲機制提高數據存儲的可靠性,并能及時檢測和恢複出錯的數據。

案例:統計詞頻

MapReduce僞代碼

實現Map和Reduce兩個函數

Map函數和Reduce函數是交給用戶實現的,這兩個函數定義了任務本身。

Map函數

接受一個鍵值對(key-value pair),産生一組中間鍵值對。MapReduce框架會将map函數産生的中間鍵值對裡鍵相同的值傳遞給一個reduce函數。

ClassMapper

methodmap(String input_key, String input_value):

// input_key: text document name

// input_value: document contents

for eachword w ininput_value:

EmitIntermediate(w, "1");

Reduce函數

接受一個鍵,以及相關的一組值,将這組值進行合并産生一組規模更小的值(通常隻有一個或零個值)。

ClassReducer

method reduce(String output_key,Iteratorintermediate_values):

// output_key: a word

// output_values: a list of counts

intresult = 0;

for eachv inintermediate_values:

result += ParseInt(v);

Emit(AsString(result));

其他實現

Nutch項目開發了一個實驗性的MapReduce的實現。

相關詞條

相關搜索

其它詞條