綜述
Map(映射)與Reduce(化簡)來源于LISP和其他函數(shù)式編程語言中的古老的映射和化簡操作无虚,MapReduce操作數(shù)據(jù)的最小單位是一個(gè)鍵值對(duì)。用戶在使用MapReduce編程模型的時(shí)候衍锚,第一步就需要將數(shù)據(jù)抽象為鍵值對(duì)的形式友题,接著map函數(shù)會(huì)以鍵值對(duì)作為輸入,經(jīng)過map函數(shù)的處理戴质,產(chǎn)生一系類新的鍵值對(duì)作為中間結(jié)果輸出到本地度宦。MapReduce計(jì)算框架會(huì)自動(dòng)將這些中間結(jié)果數(shù)據(jù)按照鍵做聚合處理,并將鍵相同的數(shù)據(jù)分發(fā)給reduce函數(shù)處理(用戶可以設(shè)置分發(fā)規(guī)則)告匠。reduce函數(shù)以鍵和對(duì)應(yīng)的值的集合作為輸入戈抄,經(jīng)過reduce函數(shù)的處理后,產(chǎn)生了另外一系列鍵值對(duì)作為最終輸出后专。
如果用表達(dá)式表示划鸽,其過程如下式所示。
{Key1, Value1} → {Key2, List<Value2>} → {Key3, Value3}
簡單案例
讀者可能覺得上面的描述和表達(dá)式非常抽象戚哎,那么讓我們先來看一個(gè)例子裸诽。有一籃蘋果,一些是紅蘋果型凳,一些是青蘋果丈冬,每個(gè)蘋果有一個(gè)唯一編號(hào),如圖4-1所示啰脚,要解決的問題是統(tǒng)計(jì)該籃蘋果的數(shù)目、紅蘋果(深色)的個(gè)數(shù)和青蘋果(淺色)的個(gè)數(shù)实夹。
圖4-1 紅蘋果和青蘋果
假設(shè)有A橄浓、B、C三個(gè)人亮航,A獲得第一排蘋果荸实,B獲得第二排蘋果,這時(shí)缴淋,A和B分別統(tǒng)計(jì)自己手上的蘋果的個(gè)數(shù)准给,然后將結(jié)果告知C,C將A重抖、B的結(jié)果做一次匯總露氮,得到最后結(jié)果。對(duì)于這個(gè)過程钟沛,其實(shí)用到了MapReduce的思想畔规。我們可以從圖4-2看出端倪。
圖4-2 用MapReduce的思想完成蘋果計(jì)數(shù)
A的map函數(shù)的輸入的格式為鍵值對(duì)appleId-count恨统,比如“11-1”表示appleId為11的蘋果個(gè)數(shù)為1叁扫,經(jīng)過map函數(shù)的累和三妈,即將所有appleId的count相加,輸出為新的鍵值對(duì)AppleCount-6莫绣,此時(shí)B也進(jìn)行同樣的操作畴蒲,由于A和B的map函數(shù)輸出的鍵值對(duì)的鍵相同,都為“AppleCount”对室,所以MapReduce框架會(huì)將其都分發(fā)到C作為reduce函數(shù)的輸入模燥,并在reduce函數(shù)中完成對(duì)鍵相同的值的累和,并輸出最后結(jié)果AppleCount-12软驰。如果用表達(dá)式表示涧窒,即為:
{appleId, count} → {AppleCount, List<count>} → {AppleCount, count}
在這個(gè)例子中,就是用MapReduce的思想來完成蘋果計(jì)數(shù)的問題锭亏,細(xì)心的讀者可能發(fā)現(xiàn)纠吴,這個(gè)例子中reduce函數(shù)只執(zhí)行了一次,是否可以執(zhí)行多次呢慧瘤,答案是肯定的戴已,下面來看用MapReduce思想解決對(duì)紅蘋果和青蘋果分別計(jì)數(shù)的問題。
假設(shè)有A锅减、B糖儡、C、D四個(gè)人怔匣,A獲得第一排蘋果握联,B獲得第二排蘋果,A將手上的紅蘋果給C每瞒、青蘋果給D金闽,B將手上的紅蘋果給C、青蘋果給D剿骨。C代芜、D再統(tǒng)計(jì)各自手上的結(jié)果,得到最后結(jié)果浓利,如圖4-3所示挤庇。
圖4-3 用MapReduce完成蘋果顏色統(tǒng)計(jì)
A的map函數(shù)的輸入同上次一樣,在map函數(shù)中贷掖,用color和appleId作為新的鍵值對(duì)重新輸出嫡秕,B也做同樣的操作。而A苹威、B的map函數(shù)的輸出的鍵值對(duì)會(huì)因?yàn)椴煌逆I被分別分發(fā)到C和D執(zhí)行reduce函數(shù)淘菩,而真正的計(jì)數(shù)是由reduce函數(shù)完成,并輸出最后結(jié)果。這里reduce函數(shù)一共執(zhí)行了兩次潮改,第一次是處理鍵為Red的數(shù)據(jù)狭郑,第二次是處理鍵為Green的數(shù)據(jù)。如果用表達(dá)式表示汇在,即為:
{appleId, count} → {color, List<appleId>} → {color, count}
總結(jié)
要理解MapReduce的編程思想翰萨,其核心的一點(diǎn)就是將數(shù)據(jù)用鍵值對(duì)表示。
在現(xiàn)實(shí)生活中糕殉,很多數(shù)據(jù)要么本身就為鍵值對(duì)的形式亩鬼,要么可以用鍵值對(duì)這種方式來表示,例如電話號(hào)碼和通話記錄阿蝶,文件名和文件存儲(chǔ)的數(shù)據(jù)等雳锋,鍵值對(duì)并不是高端數(shù)據(jù)挖掘獨(dú)有的數(shù)據(jù)模型,而是存在于我們身邊非常普通的模型羡洁。
利用分而治之的思想玷过,可以將很多復(fù)雜的數(shù)據(jù)分析問題轉(zhuǎn)變?yōu)橐幌盗蠱apReduce作業(yè),利用Hadoop的提供MapReduce計(jì)算框架筑煮,實(shí)現(xiàn)分布式計(jì)算辛蚊,這樣就能對(duì)海量數(shù)據(jù)進(jìn)行復(fù)雜的數(shù)據(jù)分析,這也是MapReduce的意義所在真仲。