MapReduce简述
MapReduce
參考:
https://www.cnblogs.com/lixiansheng/p/8942370.html
https://baike.baidu.com/item/MapReduce/133425?fr=aladdin
概念
MapReduce是面向大數(shù)據(jù)并行處理的計算模型,用于大規(guī)模數(shù)據(jù)集的并行計算。它提供了一個龐大但設(shè)計精良的并行計算軟件框架,能自動完成計算任務(wù)的并行化處理,自動劃分計算數(shù)據(jù)和計算任務(wù),在集群節(jié)點上自動分配和執(zhí)行任務(wù)以及收集計算結(jié)果,將數(shù)據(jù)分布存儲、數(shù)據(jù)通信、容錯處理等并行計算涉及到的很多系統(tǒng)底層的復(fù)雜細(xì)節(jié)交由系統(tǒng)負(fù)責(zé)處理。
體系結(jié)構(gòu)
MapReduce體系結(jié)構(gòu)主要由四部分組成:Client, JobTracker, TaskTracker, Task。
- Client:用戶編寫MapReduce程序通過Client提交到JobTracker端,用戶可以通過Client提供的接口查看作業(yè)的運(yùn)行狀態(tài)。
- JobTracker:負(fù)責(zé)資源監(jiān)控和作業(yè)調(diào)度,JobTracker監(jiān)控所有TaskTracker與Job的健康狀況,一旦發(fā)現(xiàn)失敗,就將相應(yīng)的任務(wù)轉(zhuǎn)移到其他節(jié)點。 JobTracker會跟蹤任務(wù)的執(zhí)行進(jìn)度、資源使用量等信息,并將這些信息告訴任務(wù)調(diào)度器TaskScheduler,而調(diào)度器會在資源出現(xiàn)空閑時,選擇合適的任務(wù)去使用這些資源。
- TaskTracker:TaskTracker會周期性地通過“心跳”將本節(jié)點上資源的使用情況和任務(wù)的運(yùn)行進(jìn)度匯報給JobTracker,同時接收J(rèn)obTracker發(fā)送過來的命令并執(zhí)行相應(yīng)的操作(如啟動新任務(wù)、殺死任務(wù)等)。 TaskTracker使用slot等量劃分本節(jié)點上的資源量(CPU、內(nèi)存等)。一個Task獲取到一個slot后才有機(jī)會運(yùn)行,而Hadoop調(diào)度器的作用就是將各個TaskTracker上的空閑slot分配給Task使用。slot分為Map slot和Reduce slot兩種,分別供Map Task和Reduce Task使用。
- Task:分為Map Task和Reduce Task,均由Task Tracker啟動。
工作原理
User Program鏈接了MapReduce庫,實現(xiàn)了最基本的Map函數(shù)和Reduce函數(shù)。
- MapReduce庫先把User Program的輸入文件劃分為m份(用戶定義),通常每一份16mb~64mb,如圖劃分為split 0 ~ split 4。
- 使用fork()將用戶進(jìn)程拷貝到集群內(nèi)其他機(jī)器上,其中一個稱為master,其余稱為worker。master負(fù)責(zé)調(diào)度,為空閑worker分配作業(yè)(Map作業(yè)或者Reduce作業(yè)),worker的數(shù)量也是由用戶指定。
- 被分配了Map作業(yè)的worker,開始讀取對應(yīng)分片的輸入數(shù)據(jù)。Map作業(yè)從輸入數(shù)據(jù)中抽取鍵值對,每一個鍵值對都作為參數(shù)傳遞給map函數(shù),map函數(shù)產(chǎn)生的中間鍵值對(中間結(jié)果)被緩存在內(nèi)存中。
- 緩存的中間鍵值對(中間結(jié)果)會被定期寫入本地磁盤,而且被分為R個區(qū),R的大小是由用戶定義的,將來每個區(qū)會對應(yīng)一個Reduce作業(yè)。這些中間鍵值對(中間結(jié)果)的位置會被通報給master,master負(fù)責(zé)將信息轉(zhuǎn)發(fā)給Reduce worker。
- master向分配了Reduce作業(yè)的worker通知它所負(fù)責(zé)的分區(qū)的位置,當(dāng)Reduce worker把所有它負(fù)責(zé)的中間鍵值對都讀過來后,先對它們進(jìn)行排序,使得相同鍵的鍵值對聚集在一起。對于每個唯一的鍵,都將鍵與關(guān)聯(lián)的值傳遞給reduce函數(shù),reduce函數(shù)產(chǎn)生的輸出會添加到這個分區(qū)的輸出文件中。
- 當(dāng)所有的Map和Reduce作業(yè)都完成了,master喚醒正版的user program,MapReduce函數(shù)調(diào)用返回user program的代碼。
案例:統(tǒng)計詞頻
如果想統(tǒng)計下過去10年計算機(jī)論文出現(xiàn)最多的幾個單詞,看看大家都在研究些什么,那收集好論文后,該怎么辦呢?
方法一:我可以寫一個小程序,把所有論文按順序遍歷一遍,統(tǒng)計每一個遇到的單詞的出現(xiàn)次數(shù),最后就可以知道哪幾個單詞最熱門了。
這種方法在數(shù)據(jù)集比較耗時,是非常有效的,而且實現(xiàn)最簡單,用來解決這個問題很合適。
方法二:寫一個多線程程序,并發(fā)遍歷論文。
這個問題理論上是可以高度并發(fā)的,因為統(tǒng)計一個文件時不會影響統(tǒng)計另一個文件。當(dāng)我們的機(jī)器是多核或者多處理器,方法二肯定比方法一高效。但是寫一個多線程程序要比方法一困難多了,我們必須自己同步共享數(shù)據(jù),比如要防止兩個線程重復(fù)統(tǒng)計文件。
方法三:把作業(yè)交給多個計算機(jī)去完成。
我們可以使用方法一的程序,部署到N臺機(jī)器上去,然后把論文集分成N份,一臺機(jī)器跑一個作業(yè)。這個方法跑得足夠快,但是部署起來很麻煩,我們要人工把程序copy到別的機(jī)器,要人工把論文集分開,最痛苦的是還要把N個運(yùn)行結(jié)果進(jìn)行整合(當(dāng)然我們也可以再寫一個程序)。
方法四:使用MapReduce
MapReduce本質(zhì)上就是方法三,但是如何拆分文件集,如何copy程序,如何整合結(jié)果等,這些都是框架定義好的。我們只要定義好這個任務(wù)用戶程序(Map函數(shù)和Reduce函數(shù)),其它都交給MapReduce。
總結(jié)
以上是生活随笔為你收集整理的MapReduce简述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDFS(一)
- 下一篇: MongoDB 分片