在Hackbright做導師期間,我被要求向技術背景有限的學生解釋MapReduce演算法,於是我想出了一個有趣的例子,用以闡釋它是如何工作的。
例子
你想數出一摞牌中有多少張黑桃。直觀方式是一張一張檢查並且數出有多少張是黑桃。
MapReduce方法則是:
- 給在座的所有玩家中分配這摞牌
- 讓每個玩家數自己手中的牌有幾張是黑桃,然後把這個數目彙報給你
- 你把所有玩家告訴你的數字加起來,得到最後的結論
背景
谷歌在2004年發表了可以分析大量資料的MapReduce演算法。每當你聽到“大資料”這個詞時,它指的是因為太大而讓僅僅一臺機器難以有效儲存或分析的問題。MapReduce通過把計算量分配給不同的計算機群,能夠解決大部分和大資料有關的分析問題。Hadoop提供了最受歡迎的利用MapReduce演算法來管理大資料的開源方式。現今MapReduce是主流。
所以通常來說,每當你聽到“大資料”,那也許意味著Hadoop被用來儲存資料,也通常意味著資料的抽取和檢索是用的MapReduce。
拆分
MapReduce合併了兩種經典函式:
- 對映(Mapping)對集合裡的每個目標應用同一個操作。即,如果你想把表單裡每個單元格乘以二,那麼把這個函式單獨地應用在每個單元格上的操作就屬於mapping。
- 化簡(Reducing )遍歷集合中的元素來返回一個綜合的結果。即,輸出表單裡一列數字的和這個任務屬於reducing。
重新審視上面的例子
重新審視我們原來那個分散紙牌的例子,我們有MapReduce資料分析的基本方法。友情提示:這不是個嚴謹的例子。在這個例子裡,人代表計算機,因為他們同時工作,所以他們是個叢集。在大多數實際應用中,我們假設資料已經在每臺計算機上了 – 也就是說把牌分發出去並不是MapReduce的一步。(事實上,在計算機叢集中如何儲存檔案是Hadoop的真正核心。)
通過把牌分給多個玩家並且讓他們各自數數,你就在並行執行運算,因為每個玩家都在同時計數。這同時把這項工作變成了分散式的,因為多個不同的人在解決同一個問題的過程中並不需要知道他們的鄰居在幹什麼。
通過告訴每個人去數數,你對一項檢查每張牌的任務進行了對映。 你不會讓他們把黑桃牌遞給你,而是讓他們把你想要的東西化簡為一個數字。
另外一個有意思的情況是牌分配得有多均勻。MapReduce假設資料是洗過的(shuffled)- 如果所有黑桃都分到了一個人手上,那他數牌的過程可能比其他人要慢很多。
如果有足夠的人的話,問一些更有趣的問題就相當簡單了 – 比如“一摞牌的平均值(二十一點演算法)是什麼”。你可以通過合併“所有牌的值的和是什麼”及“我們有多少張牌”這兩個問題來得到答案。用這個和除以牌的張數就得到了平均值。
結論
MapReduce演算法的機制要遠比這複雜得多,但是主體思想是一致的 – 通過分散計算來分析大量資料。無論是Facebook、NASA,還是小創業公司,MapReduce都是目前分析網際網路級別資料的主流方法。有趣的是,MapReduce在多於10PB資料時趨向於變慢,所以谷歌在他們今年的IO大會上報告稱MapReduce已經不夠他們用了,請參見這篇資訊《谷歌棄用 MapReduce, 推出替代品 Cloud Dataflow》。
推薦閱讀:《我是如何向老婆解釋MapReduce的?》
打賞支援我翻譯更多好文章,謝謝!
打賞譯者
打賞支援我翻譯更多好文章,謝謝!