什麼是MapReduce?

1、MapReduce來龍去脈 

MapReduce是一個說難懂也難懂、說好懂也好懂的概念。 
說它難懂,是因爲,如果你只理論上的去學習、去理解,確實很難懂。 
說它好懂,是因爲,如果你親手在hadoop運行過幾個MapReduce的job,並稍微學點hadoop的工作原理,基本上也就理解MapReduce的概念了。 

所以,有句話說的特別好:“如果將編程比作運動的話,那麼它絕對不是表演項目,而是競技項目。”(摘自《Erlang程序設計》第10頁) 

但是,在這裏,我還是想向不瞭解MapReduce的同學們介紹一下MapReduce。 
MapReduce借用了函數式編程的概念,是google發明的一種數據處理模型。因爲google幾乎爬了互聯網上的所有網頁,要爲處理這些網頁併爲搜索引擎建立索引是一項非常艱鉅的任務,必須藉助成千上萬臺機器同時工作(也就是分佈式並行處理),纔有可能完成建立索引的任務。 

所以,google發明了MapReduce數據處理模型,而且他們還就此發表了相關論文。 


後來,Doug Cutting老大就根據這篇論文硬生生的複製了一個MapReduce出來,也就是今天的Hadoop。如果沒聽說過hadoop,請參考《hadoop掃盲篇》。 


2、MapReduce工作過程 

知道了MapReduce是分佈式數據處理編程模型後,下面我們看看它是怎麼工作的。 

MapReduce處理數據過程主要分成2個階段:map階段和reduce階段。先執行map階段,再執行reduce階段。 

1) 在正式執行map函數前,需要對輸入進行“分片”(就是將海量數據分成大概相等的“塊”,hadoop的一個分片默認是64M),以便於多個map同時工作,每一個map任務處理一個“分片”。 
2) 分片完畢後,多臺機器就可以同時進行map工作了。 
   map函數要做的事情,相當於對數據進行“預處理”,輸出所要的“關切”。 
   map對每條記錄的輸出以<key,value> pair的形式輸出。 
3) 在進入reduce階段之前,還要將各個map中相關的數據(key相同的數據)歸結到一起,發往一個reducer。這裏面就涉及到多個map的輸出“混合地”對應多個reducer的情況,這個過程叫做“洗牌”。 
4) 接下來進入reduce階段。相同的key的map輸出會到達同一個reducer。 
   reducer對key相同的多個value進行“reduce操作”,最後一個key的一串value經過reduce函數的作用後,變成了一個value。 


上面粗略的介紹了MapRedcue。來發張圖,更有利於理解: 
 
上圖來自《Hadoop The Definitive Guide》 
發佈了71 篇原創文章 · 獲贊 27 · 訪問量 100萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章