我們都知道作為搜尋引擎頭把交椅的谷歌,每天都要處理數以億計的資料,面對這麼大量的資料,如何進行資料的計算成為了頭疼的問題。不過谷歌的人才濟濟,很快就有人發明了MapReduce框架,透過它就解決了資料的分散式計算問題。
誕生歷史在2004年的時候,谷歌釋出了一篇論文,論文裡面詳細講述了谷歌在內部是如何進行海量資料的分散式計算的。
開源社群根據這篇論文實現了
自己的分散式計算架構,也就是我們常說的hadoop框架,有了它,很多大公司也可以像谷歌一樣進行大資料的計算。
分而治之MapReduce的核心思想就是分而治之,也就是我們經常提到的將大問題劃分成一個個小問題,然後一點點去解決小問題,當小問題解決了,大問題也就迎刃而解了。
分治法要求我們先拆分問題,然後得到每個單獨結果之後再進行合併,最後得到的就是最後索要計算問題的答案。
計算過程MapReduce進行計算的過程主要分為6個步驟。
inputsplitmapshufflereducefinalize透過上面的步驟,就可以實現資料分而治之,就可以將資料進行分散式計算,就可以將資料拆分成一個個小問題,然後得到最終的計算結果
案例分析我們可以假設我們有一個文件,文件的每行都有很多單詞,我們要統計這個文件中每個單詞出現的行號,其實這個問題就是我們經常聽到的倒排索引。
文件如下(逗號前面的是行號,後面的是句子):
1,tom is good2,you are good3,tom and you are good
首先我們將文件作為input輸入物件,然後我們進行split拆分,讓不同的程序或者不同的任務去處理不同的行,比如我們有task1,task2,task3三個任務。
task11,tom is good
task22,you are good
task13,tom and you are good
進行任務拆分之後,我們需要使用map進行資料的統計(逗號前面是單詞,後面是出現的行號)
task1tom,1is,1good,1
task2tom,1is,1good,1
task3you,2are,2good,2
資料統計之後,我們需要使用shuffle進行資料的排序整理
and,3are,2 are,3
good,1good,2good,3
is,1tom,1tom,3you,2you,3
再然後,我們就需要進行reduce規約操作,進行資料的合併
and:3are:2,3good:1,2,3is:1tom:1,3you:2,3
最後,我們將結果進行輸出就可以了。
總結透過上面的例子我們可以理解到MapReduce的核心思想,透過將大資料拆解成獨立的小塊資料,每個小塊資料可以平行計算,大大提高了計算的效率,同時也降低了計算的開銷,透過Map進行資料的拆分,透過reduce進行資料的合併,最後得到我們想要的計算結果。
正所謂天下大勢,分久必合合久必分。