產生背景
MapReduce這種并行編程模式思想最早是在1995年提出的,首次提出了“map”和
“fold”的概念,和Google現在所使用的“Map”和“Reduce”思想相吻合。
“fold”的概念,和Google現在所使用的“Map”和“Reduce”思想相吻合。
與傳統的分布式程序設計相比,MapReduce封裝了并行處理、容錯處理、本地化計算、負載均衡等細節,還提供了一個簡單而強大的接口。通過這個接口,可以把大尺度的計算自動地并發和分布執行,使編程變得非常容易。另外,MapReduce也具有較好的通用性,大量不同的問題都可以簡單地通過MapReduce來解決。
MapReduce把對數據集的大規模操作,分發給一個主節點管理下的各分節點共同完成,通過這種方式實現任務的可靠執行與容錯機制。在每個時間周期,主節點都會對分節點的工作狀態進行標記,一旦分節點狀態標記為死亡狀態,則這個節點的所有任務都將分 配給其他分節點重新執行。
據相關統計,每使用一次Google搜索引擎,Google的后臺服務器就要進行1011次運算。這么龐大的運算量,如果沒有好的負載均衡機制,有些服務器租用的利用率會很低,有些則會夢荷太重,有些甚至可能死機,這些都會影響系統對用戶的服務質量。而使用MapReduce這種編程i式,就保持了服務器之間的均衡,提高了整體效率。
編程模型
MapReduce的運行模型如圖2-2所示。圖中有M個Map操作和R個Reduce操作。

簡單地說,—個M函數就是對一部分原始數據進行指定的操作。每個Map操作都針對不同的原始數據, 因此Map與Map之間是互相獨立的,這使得它們可以充分并行化。一個Reduce操作就是對每個Map所產生的一部分中間結果進行合并操作,每個Reduce所處理的Map中間結果是互不交叉的,所有Reduce產生的最終結果經過簡單連接就形成了完整的結果集,因此Reduce也可以在并行環境下執行。
在編程的時候,開發者需要編寫兩個主要函數:

Map和Reduce的輸入參數和輸出結果根據應用的不同而有所不同。Map的輸入參數是in_key和in_value,它指明了Map需要處理的原始數據是哪些。Map的輸出結果是一組<可以,value>對,這是經過Map操作后所產生的中間結果。在進行Reduce操作之前,系統已經將所有Map產生的中間結果進行了歸類處理,使得相同key對應的一系列value能夠集結在一起提供給一個Reduce進行歸并處理,也就是說,Reduce的輸入參數是(key, [value1,…,valuem])。Reduce的工作是需要對這些對應相同key的value值進行歸并處理,最終形成(key,final_value)的結果。這樣,一個Reduce處理了一個key,所有Reduce的結果并在一起就是結果。
例如,假設我們想用MapReduce來計算一個大型文本文件中各個單詞出現的次數, Map的輸入參數指明了需要處理哪部分數據,以“<在文本中的起始位置,需要處理的數據長度>”表示,經過Map處理,形成一批中間結果“<單詞,出現次數>。而Reduce函數處理中間結果,將相同單詞出現的次數進行累加,得到每個單詞總的出現次數。