雞蛋挺住體;及MapReduce矩陣分析

謝工在GitChat發表於2013-07-22

今日面試題:雞蛋挺住體

兩個雞蛋:兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋以最少的次數確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋。

MapReduce矩陣的分析

題目:

一個很大的2D矩陣,如果某點的值,由它周圍某些點的值決定,例如下一時刻(i,j) 的值取當前時刻它的8鄰點的平均,那麼怎麼用MapReduce來實現。

分析:

首先,讓我們以WordCount為例來解釋MapReduce是怎麼工作的。

原始狀態下,輸入–Map — Shuffle — Reduce — 輸出 enter image description here

假設有如下的兩個文字檔案來執行WorkCount程式:

Hello World Bye World    
Hello Hadoop GoodBye Hadoop

map資料輸入
Hadoop針對文字檔案預設使用LineRecordReader類來實現讀取,一行一個key/value對,key取偏移量,value為行內容。

如下是map1的輸入資料:

Key1      Value1
0         Hello World Bye World

如下是map2的輸入資料:

Key1       Value1
0          Hello Hadoop GoodBye Hadoop

map輸出/combine輸入

如下是map1的輸出結果

Key2        Value2
Hello        1
World        1
Bye          1
World        1

如下是map2的輸出結果

Key2        Value2
Hello          1
Hadoop         1
GoodBye        1
Hadoop         1

combine輸出 Combiner類實現將相同key的值合併起來,它也是一個Reducer的實現。

如下是combine1的輸出

Key2         Value2
Hello            1
World            2
Bye              1

如下是combine2的輸出

Key2          Value2
Hello            1
Hadoop           2
GoodBye          1

combiner視業務情況來用,減少MAP->REDUCE的資料傳輸,提高shuffle速度,就是在map中再做一次reduce操作。combiner使用的合適,可以在滿足業務的情況下提升job的速度,如果不合適,則將導致輸出的結果不正確。

對於wordcount來說,value就是一個疊加的數字,所以map一結束就可以進行reduce的value疊加,而不必要等到所有的map結束再去進行reduce的value疊加。

reduce輸出
Reducer類實現將相同key的值合併起來。

如下是reduce的輸出

Key2               Value2
Hello                2
World                2
Bye                  1
Hadoop               2
GoodBye              1

即實現了WordCount的處理。

下圖是官方的流程圖: enter image description here

有了這個基礎知識,我們來看如何用MapReduce來解決上述問題。

以下標對作為map的key,遇到(i,j),生成(i-1,j-1),(i-1,j),etc,然後在reduce時merge相同的key,並計算value。

當你理解了MapReduce的工作原理,是不是很簡單?

本文來自微信:待字閨中,2013-07-10釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章