來(lái)源:北大青鳥總部 2023年06月15日 13:43
對(duì)于MapReduce相信大家并不陌生,它是大數(shù)據(jù)Hadoop家族中最重要的成員之一,是一個(gè)運(yùn)行在Hadoop平臺(tái)上的分布式計(jì)算框架,對(duì)于大數(shù)據(jù)這塊,大家總是覺得高深莫測(cè),淺嘗輒止,今天我們就通俗易懂的給大家講講,讓大家真正的感受到MapReduce是什么?如何使用?在哪些場(chǎng)景下用?
我們先來(lái)一個(gè)簡(jiǎn)單的Case,冬天來(lái)了,是吃火鍋的季節(jié)了,你買了肥牛、蘑菇、白菜、香菜、豆腐、鴨血、小蔥,一個(gè)個(gè)的處理干凈,裝在盤子里,火鍋底料一放,菜一下,香噴噴的火鍋就出來(lái)了。在這個(gè)吃火鍋的場(chǎng)景中,我們可以抽象一下,它包含兩部分:洗干凈菜,煮菜,換做MapReduce的語(yǔ)言,每洗干凈一個(gè)菜就是一個(gè)Map操作,將白菜Map一下,香菜Map一下,每煮一次火鍋就是一個(gè)Reduce操作。這意味著每煮一次火鍋就需要把洗干凈的菜都放進(jìn)來(lái),也就是把所有Map操作的菜都處理一下。
MapReduce還是一個(gè)分布式計(jì)算框架,所謂分布式就是可以多個(gè)操作并行。你煮的火鍋實(shí)在太好吃了,在民意要求下,你開啟了火鍋店,做大做強(qiáng)又開啟了火鍋分店,這時(shí)候你需要多個(gè)人去洗菜,一個(gè)人負(fù)責(zé)洗白菜、一個(gè)人負(fù)責(zé)切肥牛、一個(gè)人負(fù)責(zé)切豆腐,當(dāng)所有的人都處理完了之后,就有了處理好的白菜、肥牛、豆腐,這些都是基于Map白菜、Map肥牛、Map豆腐的操作下進(jìn)行的,Reduce操作是基于Key來(lái)進(jìn)行,Key就是洗干凈的白菜、肥牛、豆腐,Reduce之后就是一桌又一桌的火鍋。
總結(jié)一下,MapReduce是包含兩部分,即Map操作、Reduce操作,Map操作就是映射操作,它接受一個(gè)輸入,產(chǎn)生一個(gè)中間鍵值對(duì)的輸出,MapReduce框架會(huì)把Map函數(shù)中參數(shù)的中間鍵值對(duì)里相同的鍵值傳給Reduce函數(shù)。Reduce操作就是化簡(jiǎn),它接受一個(gè)鍵值,將這組值合并產(chǎn)生更小的值。
今年的雙十一開始了,老板交給你一個(gè)任務(wù),統(tǒng)計(jì)下所有牛仔褲最受歡迎的top3。如果是小電商平臺(tái),那很簡(jiǎn)單,寫個(gè)程序獲取所有的牛仔褲,遍歷一下每條牛仔褲被購(gòu)買的次數(shù),再做一個(gè)排序,就知道最受歡迎的牛仔褲了。但是當(dāng)我是一個(gè)中型電商平臺(tái)時(shí),遍歷就會(huì)比較慢了,這時(shí)候可以寫一個(gè)多線程的程序,在多核機(jī)器上去運(yùn)行就行。當(dāng)我是一個(gè)大型電商平臺(tái),比如淘寶、京東、拼多多,我們就可以把計(jì)算每個(gè)牛仔褲被買次數(shù)的作業(yè)分給多臺(tái)機(jī)器去計(jì)算,把總的銷售數(shù)據(jù)分成N份,每臺(tái)計(jì)算機(jī)計(jì)算1份,最后匯總起來(lái)倒序排即可。上述三種算法,其實(shí)我們也可以使用MapReduce來(lái)完成噢。
在MapReduce中,Map函數(shù)和Reduce函數(shù)都是由我們自己定義的,在統(tǒng)計(jì)牛仔褲的銷量top3場(chǎng)景中,我們定義map函數(shù)獲取每款牛仔褲,Reduce函數(shù)統(tǒng)計(jì)每款牛仔褲被購(gòu)買的次數(shù)。在下圖中,Map函數(shù)接受的key是所有商品,值是取牛仔褲,每遇到一個(gè)牛仔褲就產(chǎn)生一個(gè)中間鍵值對(duì)<jeans,1>,不同牛仔褲是不同的鍵值對(duì),比如bluejeans,yellowjeans。Map函數(shù)將鍵值相同的鍵值對(duì)都傳遞給reduce,reduce將每個(gè)鍵值對(duì)的value進(jìn)行累加,最后獲取到每條牛仔褲被購(gòu)買的次數(shù),存儲(chǔ)在底層的分布式文件系統(tǒng)HDFS中,業(yè)務(wù)層可以通過(guò)接口獲取數(shù)據(jù),展現(xiàn)最熱銷的top3牛仔褲。
通過(guò)實(shí)例我們明白了MapReduce是個(gè)什么東東,我們可以再結(jié)合Google論文中的工作原理流程圖來(lái)進(jìn)行最后的梳理。
在流程圖中上層業(yè)務(wù)通過(guò)UserProgram連接MapReduce庫(kù),將輸入文件分成M份,即圖中的spilt0、spilt1、spilt2、spilt3、spilt4...,在使用master節(jié)點(diǎn)給worker節(jié)點(diǎn)分配Map作業(yè),我們有M份文件就分配M個(gè)worker,被分配了Map作業(yè)的worker讀取對(duì)應(yīng)的數(shù)據(jù),生成中間鍵值對(duì),存儲(chǔ)在內(nèi)存和磁盤中,Reduce函數(shù)也會(huì)根據(jù)作業(yè)數(shù)進(jìn)行分區(qū),如果有M個(gè)作業(yè),就分成M個(gè)區(qū),由Master節(jié)點(diǎn)把分區(qū)作業(yè)從磁盤中傳遞給到ReduceWorker節(jié)點(diǎn),Reduceworker節(jié)點(diǎn)獲取到所有的中間鍵值對(duì)之后,進(jìn)行排序處理,獲取每個(gè)相同中間鍵值對(duì)的值。當(dāng)所有的Map作業(yè)和Reduce作業(yè)都執(zhí)行完了之后,master節(jié)點(diǎn)喚醒userprogram獲取數(shù)據(jù)。
通過(guò)老板安排的簡(jiǎn)簡(jiǎn)單單的獲取最熱銷牛仔褲的任務(wù),我們從原理到實(shí)踐講解了MapReduce的使用。MapReduce它比較適合大型網(wǎng)站的數(shù)據(jù)統(tǒng)計(jì)、在海量數(shù)據(jù)中獲取某些有特征的數(shù)據(jù),但是不太適合實(shí)時(shí)計(jì)算,從它的輸入都是靜態(tài)數(shù)據(jù),計(jì)算過(guò)程,存儲(chǔ)是在HDFS都可以看到執(zhí)行任務(wù)相對(duì)耗時(shí)比較長(zhǎng)。我們結(jié)合自己業(yè)務(wù)情況,使用在最合適的場(chǎng)景即可。