之前寫過關於hadoop方面的mapreduce框架的文章mapreduce框架hadoop應用(一) 介紹了mapreduce的模型和hadoop下的mapreduce框架,此文章將進一步介紹mapreduce計算模型能用於解決什麼問題及有什麼巧妙優化。
mapreduce準確的說,它不是乙個產品,而是一種解決問題的思路,能夠用分治策略來解決問題。例如:網頁抓取、日誌處理、索引倒排、查詢請求彙總等等問題。通過分治法,將乙個大規模的問題,分解成多個小規模的問題(分),多個小規模問題解決,再統籌小問題的解(合),就能夠解決大規模的問題。最早在單機的體系下計算,當輸入資料量巨大的時候,處理很慢。如何能夠在短時間內完成處理,很容易想到的思路是,將這些計算分布在成百上千的主機上,但此時,會遇到各種複雜的問題,例如:併發計算、資料分發、錯誤處理、資料分布、負載均衡、集群管理與通訊等,將這些問題綜合起來將是比較複雜的問題了,而google為了方便使用者使用系統,提供給了使用者很少的介面,去解決複雜的問題。
(1) map函式介面:處理乙個基於key/value(後簡稱k/v)的資料對(pair)資料集合,同時也輸出基於k/v的資料集合。
(2) reduce函式介面:用來合併map輸出的k/v資料集合
假設我們要統計大量文件中單詞出現的次數。
map
輸入k/v:pair(文件名稱,文件內容)
輸出k/v:pair(單詞,1)
reduce
輸入k/v:pair(單詞,1)
輸出k/v:pair(單詞,總計數)
map偽**:
map(list)reduce偽**:
reduce(list)
可以看到,r個reduce例項併發進行處理,直接輸出最後的計數結果。需要理解的是,由於這是業務計算的最終結果,乙個單詞的計數不會出現在兩個例項裡。即:如果(a, 256)出現在了例項1的輸出裡,就一定不會出現在其他例項的輸出裡,否則的話,還需要合併,就不是最終結果。
再看中間步驟,map到reduce的過程,m個map例項的輸出,會作為r個reduce例項的輸入。
問題一:每個map都有可能輸出(a, 1),而最終結果(a, 256)必須由乙個reduce輸出,那如何保證每個map輸出的同乙個key,落到同乙個reduce上去呢?
這就是「分割槽函式」的作用。分割槽函式是使用mapreduce的使用者按所需實現的,決定map輸出的每乙個key應當落到哪個reduce上的函式。如果使用者沒有實現,會使用預設分割槽函式。為了保證每乙個reduce例項都能夠差不多時間結束工作任務,分割槽函式的實現要點是:盡量負載均衡,即資料均勻分攤,防止資料傾斜造成部分reduce節點資料飢餓。如果資料不是負載均衡的,那麼有些reduce例項處理的單詞多,有些reduce處理的單詞少,這樣就可能出現所有reduce例項都處理結束,最後等待乙個需要長時間處理的reduce情況。
問題二:每個map都有可能輸出多個(a, 1),這樣就增大了網路頻寬資源以及reduce的計算資源,怎麼辦?
這就是「合併函式」的作用。有時,map產生的中間key的重複資料比重很大,可以提供給使用者乙個自定義函式,在乙個map例項完成工作後,本地就做一次合併,這樣將大大節約網路傳輸與reduce計算資源。合併函式在每個map任務結束前都會執行一次,一般來說,合併函式與reduce函式是一樣的,區別是:合併函式是執行map例項本地資料合併,而reduce函式是執行最終的合併,會收集多個map例項的資料。對於詞頻統計應用,合併函式可以將:乙個map例項的多個(a, 1)合併成乙個(a, count)輸出。
問題三:如何確定檔案到map的輸入呢?
隨意即可,只要負載均衡,均勻切分輸入檔案大小就行,不用管分到哪個map例項都能正確處理。
問題四:map和reduce可能會產生很多磁碟io,將更適用於離線計算,完成離線作業。
分布式計算模型MapReduce
1 需求 統計乙個檔案中每乙個單詞出現的總次數。2 案例資料 3 編寫reducer類 public class wordcountreducer extends reducer v.set sum context.write key,v 4 編寫驅動類 public class wordcount...
MapReduce既是程式設計模型又是計算框架
learn from 從0開始學大資料 極客時間 包含 map 和 reduce 兩個過程 計算單詞數量的 mapreduce 版本 public class wordcount mr 計算框架會將這些 word,1 收集起來 將相同的 word 放在一起,形成 這樣的 資料 然後將其輸入給 red...
MapReduce程式設計模型
計算採用一組輸入鍵 值對,並產生一組輸出鍵 值對。mapreduce庫的使用者將計算表達為兩個函式 map和reduce。input1 map a,1 b,1 c,1 input2 map b,1 input3 map a,1 c,1 reduce c,2 reduce b,2 reduce a,2...