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》