1.Hadoop和MapReduce概念數據庫
- Mapreduce是一種模式。
- Hadoop是一種框架。
- Hadoop是一個實現了mapreduce模式的開源的分佈式並行編程框架。
2.Hadoop框架
藉助Hadoop 框架及雲計算核心技術MapReduce 來實現數據的計算和存儲,而且將HDFS 分佈式文件系統和HBase 分佈式數據庫很好的融入到雲計算框架中,從而實現雲計算的分佈式、並行計算和存儲,而且得以實現很好的處理大規模數據的能力。
3.MapReduce 原理
3.1 map和reduce函數
map函數和reduce函數是交給用戶實現的,這兩個函數定義了任務自己。
- map函數:接受一個鍵值對(key-value pair),產生一組中間鍵值對。MapReduce框架會將map函數產生的中間鍵值對裏鍵相同的值傳遞給一個reduce函數。
- reduce函數:接受一個鍵,以及相關的一組值,將這組值進行合併產生一組規模更小的值(一般只有一個或零個值)。(一個reduce對應一個key)
統計詞頻的MapReduce函數的核心代碼很是簡短,主要就是實現這兩個函數。
爲了理清map函數和reduce函數的做用,在統計詞頻的例子裏,
1)map函數接受的鍵是文件名,值是文件的內容,map逐個遍歷單詞,每遇到一個單詞w,就產生一箇中間鍵值對<w, "1">,這表示單詞w咱又找到了一個;
2)MapReduce將鍵相同(都是單詞w)的鍵值對傳給reduce函數,這樣reduce函數接受的鍵就是單詞w,值是一串"1"(最基本的實現是這樣,但能夠優化),個數等於鍵爲w的鍵值對的個數,而後將這些「1」累加就獲得單詞w的出現次數。最後這些單詞的出現次數會被寫到用戶定義的位置,存儲在底層的分佈式存儲系統(GFS或HDFS)。
3.2 工做原理
1)
MapReduce庫先把user program的輸入文件劃分爲M份(M爲用戶定義),每一份一般有16MB到64MB,如圖左方所示分紅了split0~4;而後使用fork將用戶進程拷貝到集羣內其它機器上。
2)
user program的副本中有一個稱爲master,其他稱爲worker,master是負責調度的,爲空閒worker分配做業(Map做業或者Reduce做業),worker的數量也是能夠由用戶指定的。
3)
被分配了Map做業的worker,開始讀取對應分片的輸入數據,Map做業數量是由M決定的,和split一一對應;Map做業從輸入數據中抽取出鍵值對,每個鍵值對都做爲參數傳遞給map函數,map函數產生的中間鍵值對被緩存在內存中。(
也就是不作重複工做
)。
4)
緩存的中間鍵值對會被按期寫入本地磁盤,並且被分爲R個區,R的大小是由用戶定義的,未來每一個區會對應一個Reduce做業;這些中間鍵值對的位置會被通報給master,master負責將信息轉發給Reduce worker。
5)master通知分配了Reduce做業的worker它負責的分區在什麼位置(確定不止一個地方,每一個Map做業產生的中間鍵值對均可能映射到全部R個不一樣分區),當Reduce worker把全部它負責的中間鍵值對都讀過來後,先對它們進行排序,使得相同鍵的鍵值對彙集在一塊兒。由於不一樣的鍵可能會映射到同一個分區也就是同一個Reduce做業(誰讓分區少呢),因此排序是必須的。
6)reduce worker遍歷排序後的中間鍵值對,對於每一個惟一的鍵,都將鍵與關聯的值傳遞給reduce函數,reduce函數產生的輸出會添加到這個分區的輸出文件中。
7)
當全部的Map和Reduce做業都完成了,master喚醒正版的user program,MapReduce函數調用返回user program的代碼。
其中對於reduce部分須要更詳細的理解,參見下圖:
說明: 從圖中有幾點須要注意:
1) map後個節點(機器)被映射到2個(R)區域塊中(在字頻統計中,每塊要統計的一個單詞),接下來咱們能夠看到不一樣的塊被不一樣的reduce work去處理。
2) reduce在處理的時候,每一個reduce work都須要再內部進行排序,通常採用merge。
全部執行完畢後,MapReduce輸出放在了R個分區的輸出文件中(分別對應一個Reduce做業)。用戶一般並不須要合併這R個文件,而是將其做爲輸入交給另外一個MapReduce程序處理。整個過程當中,輸入數據是來自底層分佈式文件系統(GFS)的,中間數據是放在本地文件系統的,最終輸出數據是寫入底層分佈式文件系統(GFS)的。並且咱們要注意Map/Reduce做業和map/reduce函數的區別:Map做業處理一個輸入數據的分片,可能須要調用屢次map函數來處理每一個輸入鍵值對;Reduce做業處理一個分區的中間鍵值對,期間要對每一個不一樣的鍵調用一次reduce函數,Reduce做業最終也對應一個輸出文件。
更細緻的單詞詞頻統計參見:
參見: