日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

用通俗易懂的大白话讲解Map/Reduce原理

發(fā)布時(shí)間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用通俗易懂的大白话讲解Map/Reduce原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Hadoop簡(jiǎn)介

Hadoop就是一個(gè)實(shí)現(xiàn)了Google云計(jì)算系統(tǒng)的開源系統(tǒng),包括并行計(jì)算模型Map/Reduce,分布式文件系統(tǒng)HDFS,以及分布式數(shù)據(jù)庫(kù)Hbase,同時(shí)Hadoop的相關(guān)項(xiàng)目也很豐富,包括ZooKeeper,Pig,Chukwa,Hive,Hbase,Mahout,flume等.

這里詳細(xì)分解這里面的概念讓大家通過(guò)這篇文章了解到底是什么hadoop:




1.什么是Map/Reduce,看下面的各種解釋:


(1)MapReduce是hadoop的核心組件之一,hadoop要分布式包括兩部分,一是分布式文件系統(tǒng)hdfs,一部是分布式計(jì)算框,就是mapreduce,缺一不可,也就是說(shuō),可以通過(guò)mapreduce很容易在hadoop平臺(tái)上進(jìn)行分布式的計(jì)算編程。

(2)Mapreduce是一種編程模型,是一種編程方法,抽象理論。


(3)下面是一個(gè)關(guān)于一個(gè)程序員是如何個(gè)妻子講解什么是MapReduce?文章很長(zhǎng)請(qǐng)耐心的看。


我問(wèn)妻子:“你真的想要弄懂什么是MapReduce?” 她很堅(jiān)定的回答說(shuō)“是的”。 因此我問(wèn)道:


我:?你是如何準(zhǔn)備洋蔥辣椒醬的?(以下并非準(zhǔn)確食譜,請(qǐng)勿在家嘗試)


妻子:?我會(huì)取一個(gè)洋蔥,把它切碎,然后拌入鹽和水,最后放進(jìn)混合研磨機(jī)里研磨。這樣就能得到洋蔥辣椒醬了。



妻子:?但這和MapReduce有什么關(guān)系?

我:?你等一下。讓我來(lái)編一個(gè)完整的情節(jié),這樣你肯定可以在15分鐘內(nèi)弄懂MapReduce.


妻子:?好吧。


我:現(xiàn)在,假設(shè)你想用薄荷、洋蔥、番茄、辣椒、大蒜弄一瓶混合辣椒醬。你會(huì)怎么做呢?


妻子:?我會(huì)取薄荷葉一撮,洋蔥一個(gè),番茄一個(gè),辣椒一根,大蒜一根,切碎后加入適量的鹽和水,再放入混合研磨機(jī)里研磨,這樣你就可以得到一瓶混合辣椒醬了。


我:?沒錯(cuò),讓我們把MapReduce的概念應(yīng)用到食譜上。Map和Reduce其實(shí)是兩種操作,我來(lái)給你詳細(xì)講解下。

Map(映射): 把洋蔥、番茄、辣椒和大蒜切碎,是各自作用在這些物體上的一個(gè)Map操作。所以你給Map一個(gè)洋蔥,Map就會(huì)把洋蔥切碎。 同樣的,你把辣椒,大蒜和番茄一一地拿給Map,你也會(huì)得到各種碎塊。 所以,當(dāng)你在切像洋蔥這樣的蔬菜時(shí),你執(zhí)行就是一個(gè)Map操作。 Map操作適用于每一種蔬菜,它會(huì)相應(yīng)地生產(chǎn)出一種或多種碎塊,在我們的例子中生產(chǎn)的是蔬菜塊。在Map操作中可能會(huì)出現(xiàn)有個(gè)洋蔥壞掉了的情況,你只要把壞洋蔥丟了就行了。所以,如果出現(xiàn)壞洋蔥了,Map操作就會(huì)過(guò)濾掉壞洋蔥而不會(huì)生產(chǎn)出任何的壞洋蔥塊。


Reduce(化簡(jiǎn)):在這一階段,你將各種蔬菜碎都放入研磨機(jī)里進(jìn)行研磨,你就可以得到一瓶辣椒醬了。這意味要制成一瓶辣椒醬,你得研磨所有的原料。因此,研磨機(jī)通常將map操作的蔬菜碎聚集在了一起。

妻子:?所以,這就是MapReduce?


我:?你可以說(shuō)是,也可以說(shuō)不是。 其實(shí)這只是MapReduce的一部分,MapReduce的強(qiáng)大在于分布式計(jì)算。


妻子:?分布式計(jì)算? 那是什么?請(qǐng)給我解釋下吧。


我:?沒問(wèn)題。

我:?假設(shè)你參加了一個(gè)辣椒醬比賽并且你的食譜贏得了最佳辣椒醬獎(jiǎng)。得獎(jiǎng)之后,辣椒醬食譜大受歡迎,于是你想要開始出售自制品牌的辣椒醬。假設(shè)你每天需要生產(chǎn)10000瓶辣椒醬,你會(huì)怎么辦呢?


妻子:?我會(huì)找一個(gè)能為我大量提供原料的供應(yīng)商。


我:是的..就是那樣的。那你能否獨(dú)自完成制作呢?也就是說(shuō),獨(dú)自將原料都切碎? 僅僅一部研磨機(jī)又是否能滿足需要?而且現(xiàn)在,我們還需要供應(yīng)不同種類的辣椒醬,像洋蔥辣椒醬、青椒辣椒醬、番茄辣椒醬等等。


妻子:?當(dāng)然不能了,我會(huì)雇傭更多的工人來(lái)切蔬菜。我還需要更多的研磨機(jī),這樣我就可以更快地生產(chǎn)辣椒醬了。
我:沒錯(cuò),所以現(xiàn)在你就不得不分配工作了,你將需要幾個(gè)人一起切蔬菜。每個(gè)人都要處理滿滿一袋的蔬菜,而每一個(gè)人都相當(dāng)于在執(zhí)行一個(gè)簡(jiǎn)單的Map操作。每一個(gè)人都將不斷的從袋子里拿出蔬菜來(lái),并且每次只對(duì)一種蔬菜進(jìn)行處理,也就是將它們切碎,直到袋子空了為止。
這樣,當(dāng)所有的工人都切完以后,工作臺(tái)(每個(gè)人工作的地方)上就有了洋蔥塊、番茄塊、和蒜蓉等等。


妻子:但是我怎么會(huì)制造出不同種類的番茄醬呢?


我:現(xiàn)在你會(huì)看到MapReduce遺漏的階段—攪拌階段。MapReduce將所有輸出的蔬菜碎都攪拌在了一起,這些蔬菜碎都是在以key為基礎(chǔ)的 map操作下產(chǎn)生的。攪拌將自動(dòng)完成,你可以假設(shè)key是一種原料的名字,就像洋蔥一樣。 所以全部的洋蔥keys都會(huì)攪拌在一起,并轉(zhuǎn)移到研磨洋蔥的研磨器里。這樣,你就能得到洋蔥辣椒醬了。同樣地,所有的番茄也會(huì)被轉(zhuǎn)移到標(biāo)記著番茄的研磨器里,并制造出番茄辣椒醬。


(4)上面都是從理論上來(lái)說(shuō)明什么是MapReduce,那么咱們?cè)贛apReduce產(chǎn)生的過(guò)程和代碼的角度來(lái)理解這個(gè)問(wèn)題。
如果想統(tǒng)計(jì)下過(guò)去10年計(jì)算機(jī)論文出現(xiàn)最多的幾個(gè)單詞,看看大家都在研究些什么,那收集好論文后,該怎么辦呢??

  方法一:

? ?? ?我可以寫一個(gè)小程序,把所有論文按順序遍歷一遍,統(tǒng)計(jì)每一個(gè)遇到的單詞的出現(xiàn)次數(shù),最后就可以知道哪幾個(gè)單詞最熱門了。 這種方法在數(shù)據(jù)集比較小時(shí),是非常有效的,而且實(shí)現(xiàn)最簡(jiǎn)單,用來(lái)解決這個(gè)問(wèn)題很合適。?

 方法二:

? ?? ? 寫一個(gè)多線程程序,并發(fā)遍歷論文。?
  這個(gè)問(wèn)題理論上是可以高度并發(fā)的,因?yàn)榻y(tǒng)計(jì)一個(gè)文件時(shí)不會(huì)影響統(tǒng)計(jì)另一個(gè)文件。當(dāng)我們的機(jī)器是多核或者多處理器,方法二肯定比方法一高效。但是寫一個(gè)多線程程序要比方法一困難多了,我們必須自己同步共享數(shù)據(jù),比如要防止兩個(gè)線程重復(fù)統(tǒng)計(jì)文件。?

方法三:

? ?? ?把作業(yè)交給多個(gè)計(jì)算機(jī)去完成。?
  我們可以使用方法一的程序,部署到N臺(tái)機(jī)器上去,然后把論文集分成N份,一臺(tái)機(jī)器跑一個(gè)作業(yè)。這個(gè)方法跑得足夠快,但是部署起來(lái)很麻煩,我們要人工把程序copy到別的機(jī)器,要人工把論文集分開,最痛苦的是還要把N個(gè)運(yùn)行結(jié)果進(jìn)行整合(當(dāng)然我們也可以再寫一個(gè)程序)。?

  方法四:

? ?? ?讓MapReduce來(lái)幫幫我們吧!?

  MapReduce本質(zhì)上就是方法三,但是如何拆分文件集,如何copy程序,如何整合結(jié)果這些都是框架定義好的。我們只要定義好這個(gè)任務(wù)(用戶程序),其它都交給MapReduce。


map函數(shù)和reduce函數(shù)  


map函數(shù)和reduce函數(shù)是交給用戶實(shí)現(xiàn)的,這兩個(gè)函數(shù)定義了任務(wù)本身。?

  map函數(shù):接受一個(gè)鍵值對(duì)(key-value pair),產(chǎn)生一組中間鍵值對(duì)。MapReduce框架會(huì)將map函數(shù)產(chǎn)生的中間鍵值對(duì)里鍵相同的值傳遞給一個(gè)reduce函數(shù)。?

  reduce函數(shù):接受一個(gè)鍵,以及相關(guān)的一組值,將這組值進(jìn)行合并產(chǎn)生一組規(guī)模更小的值(通常只有一個(gè)或零個(gè)值)。?

  統(tǒng)計(jì)詞頻的MapReduce函數(shù)的核心代碼非常簡(jiǎn)短,主要就是實(shí)現(xiàn)這兩個(gè)函數(shù)。?

  map(String key, String value):?

  // key: document name?

  // value: document contents?

  for each word w in value:?

  EmitIntermediate(w, "1");?

  reduce(String key, Iterator values):?

  // key: a word?

  // values: a list of counts?

  int result = 0;?

  for each v in values:?

  result += ParseInt(v);?

  Emit(AsString(result));?

  在統(tǒng)計(jì)詞頻的例子里,map函數(shù)接受的鍵是文件名,值是文件的內(nèi)容,map逐個(gè)遍歷單詞,每遇到一個(gè)單詞w,就產(chǎn)生一個(gè)中間鍵值對(duì)<w, "1">,這表示單詞w咱又找到了一個(gè);MapReduce將鍵相同(都是單詞w)的鍵值對(duì)傳給reduce函數(shù),這樣reduce函數(shù)接受的鍵就是單詞w,值是一串"1"(最基本的實(shí)現(xiàn)是這樣,但可以優(yōu)化),個(gè)數(shù)等于鍵為w的鍵值對(duì)的個(gè)數(shù),然后將這些“1”累加就得到單詞w的出現(xiàn)次數(shù)。最后這些單詞的出現(xiàn)次數(shù)會(huì)被寫到用戶定義的位置,存儲(chǔ)在底層的分布式存儲(chǔ)系統(tǒng)(GFS或HDFS)。?




工作原理

?

  
上圖是論文里給出的流程圖。一切都是從最上方的user program開始的,user program鏈接了MapReduce庫(kù),實(shí)現(xiàn)了最基本的Map函數(shù)和Reduce函數(shù)。圖中執(zhí)行的順序都用數(shù)字標(biāo)記了。

  1.MapReduce庫(kù)先把user program的輸入文件劃分為M份(M為用戶定義),每一份通常有16MB到64MB,如圖左方所示分成了split0~4;然后使用fork將用戶進(jìn)程拷貝到集群內(nèi)其它機(jī)器上。?

  2.user program的副本中有一個(gè)稱為master,其余稱為worker,master是負(fù)責(zé)調(diào)度的,為空閑worker分配作業(yè)(Map作業(yè)或者Reduce作業(yè)),worker的數(shù)量也是可以由用戶指定的。?

  3.被分配了Map作業(yè)的worker,開始讀取對(duì)應(yīng)分片的輸入數(shù)據(jù),Map作業(yè)數(shù)量是由M決定的,和split一一對(duì)應(yīng);Map作業(yè)從輸入數(shù)據(jù)中抽取出鍵值對(duì),每一個(gè)鍵值對(duì)都作為參數(shù)傳遞給map函數(shù),map函數(shù)產(chǎn)生的中間鍵值對(duì)被緩存在內(nèi)存中。?

  4.緩存的中間鍵值對(duì)會(huì)被定期寫入本地磁盤,而且被分為R個(gè)區(qū),R的大小是由用戶定義的,將來(lái)每個(gè)區(qū)會(huì)對(duì)應(yīng)一個(gè)Reduce作業(yè);這些中間鍵值對(duì)的位置會(huì)被通報(bào)給master,master負(fù)責(zé)將信息轉(zhuǎn)發(fā)給Reduce worker。?

  5.master通知分配了Reduce作業(yè)的worker它負(fù)責(zé)的分區(qū)在什么位置(肯定不止一個(gè)地方,每個(gè)Map作業(yè)產(chǎn)生的中間鍵值對(duì)都可能映射到所有R個(gè)不同分區(qū)),當(dāng)Reduce worker把所有它負(fù)責(zé)的中間鍵值對(duì)都讀過(guò)來(lái)后,先對(duì)它們進(jìn)行排序,使得相同鍵的鍵值對(duì)聚集在一起。因?yàn)椴煌逆I可能會(huì)映射到同一個(gè)分區(qū)也就是同一個(gè)Reduce作業(yè)(誰(shuí)讓分區(qū)少呢),所以排序是必須的。?

  6.reduce worker遍歷排序后的中間鍵值對(duì),對(duì)于每個(gè)唯一的鍵,都將鍵與關(guān)聯(lián)的值傳遞給reduce函數(shù),reduce函數(shù)產(chǎn)生的輸出會(huì)添加到這個(gè)分區(qū)的輸出文件中。?

  6.當(dāng)所有的Map和Reduce作業(yè)都完成了,master喚醒正版的user program,MapReduce函數(shù)調(diào)用返回user program的代碼。?

  所有執(zhí)行完畢后,MapReduce輸出放在了R個(gè)分區(qū)的輸出文件中(分別對(duì)應(yīng)一個(gè)Reduce作業(yè))。用戶通常并不需要合并這R個(gè)文件,而是將其作為輸入交給另一個(gè)MapReduce程序處理。整個(gè)過(guò)程中,輸入數(shù)據(jù)是來(lái)自底層分布式文件系統(tǒng)(GFS)的,中間數(shù)據(jù)是放在本地文件系統(tǒng)的,最終輸出數(shù)據(jù)是寫入底層分布式文件系統(tǒng)(GFS)的。而且我們要注意Map/Reduce作業(yè)和map/reduce函數(shù)的區(qū)別:Map作業(yè)處理一個(gè)輸入數(shù)據(jù)的分片,可能需要調(diào)用多次map函數(shù)來(lái)處理每個(gè)輸入鍵值對(duì);Reduce作業(yè)處理一個(gè)分區(qū)的中間鍵值對(duì),期間要對(duì)每個(gè)不同的鍵調(diào)用一次reduce函數(shù),Reduce作業(yè)最終也對(duì)應(yīng)一個(gè)輸出文件。

總結(jié):

通過(guò)以上你是否了解什么是MapReduce了那,什么是key,怎么過(guò)濾有效數(shù)據(jù),怎么得到自己想要的數(shù)據(jù)。
MapReduce是一種編程思想,可以使用java來(lái)實(shí)現(xiàn),C++來(lái)實(shí)現(xiàn)。Map的作用是過(guò)濾一些原始數(shù)據(jù),Reduce則是處理這些數(shù)據(jù),得到我們想要的結(jié)果,比如你想造出番茄辣椒醬。也就是我們使用hadoop,比方來(lái)進(jìn)行日志處理之后,得到我們想要的關(guān)心的數(shù)據(jù)。

總結(jié)

以上是生活随笔為你收集整理的用通俗易懂的大白话讲解Map/Reduce原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。