本地搭建linux服務(wù)器做網(wǎng)站網(wǎng)站快速排名優(yōu)化價格
MapReduce是一個用于處理大數(shù)據(jù)集的編程模型和算法框架。其優(yōu)勢在于能夠處理大量的數(shù)據(jù),通過并行化來加速計算過程。它適用于那些可以分解為多個獨立子任務(wù)的計算密集型作業(yè),如文本處理、數(shù)據(jù)分析和大規(guī)模數(shù)據(jù)集的聚合等。然而,MapReduce也有其局限性,比如對于需要快速迭代的任務(wù)或者實時數(shù)據(jù)處理,MapReduce可能不是最佳選擇。
總的來說,MapReduce是大數(shù)據(jù)技術(shù)中的一個重要概念,它在Hadoop生態(tài)系統(tǒng)中發(fā)揮著關(guān)鍵作用,特別是在處理大規(guī)模數(shù)據(jù)集時,它提供了一種可靠且高效的方法來并行處理數(shù)據(jù)。本篇我們來講解一下MapReduce的相關(guān)內(nèi)容。
一 MapReduce模型介紹
隨著需要處理的數(shù)據(jù)量激增,我們開始借助分布式并行編程來提高程序的性能,分布式并行程序運行在大規(guī)模計算機集群上,可以并行執(zhí)行大規(guī)模數(shù)據(jù)處理任務(wù),從而獲得海量計算的能力。
谷歌公司最先提了分布式并行模型MapReduce,hadoop MapReduce則是其的開源實現(xiàn)。但是在MapReduce出現(xiàn)之前,就已經(jīng)有MPI一類的并行計算框架了,兩者的區(qū)別主要在于:
傳統(tǒng)并行計算框架 | MapReduce | |
---|---|---|
集群架構(gòu) | 共享式(共享內(nèi)存/共享存儲) | 非共享式 |
容錯性 | 容錯性差 | 容錯性好 |
價格 | 貴 | 相對較低 |
硬件&擴展性 | 刀片服務(wù)器+高速網(wǎng)+SAN,擴展性差 | 普通PC機,擴展性好 |
學(xué)習(xí)難度 | 高 | 低 |
使用場景 | 實時、細(xì)粒度、計算密集型 | 批處理、非實時、數(shù)據(jù)密集型 |
可以看出,兩者最大的區(qū)別在與其適用的場景不同,之前我們對于并行計算的要求更多注重計算密集型,而云計算則更注重對“大數(shù)據(jù)”的處理,因此傳統(tǒng)的并行計算框架已經(jīng)遠(yuǎn)遠(yuǎn)不能滿足我們的需求了。
MapReduce的優(yōu)點在于其易于編程、具有良好的擴展性以及高容錯性,可以實現(xiàn)上千臺服務(wù)器集群并發(fā)工作,提供數(shù)據(jù)處理能力。但同樣的,MapReduce也不適合進(jìn)行實時計算或流式計算。
MapReduce將復(fù)雜的、運行于大規(guī)模集群上的并行計算過程高度抽象到了兩個函數(shù)——map和reduce。通過MapReduce框架,我們不需要掌握分布式編程的細(xì)節(jié),也能夠容易的將自己的程序運行在分布式系統(tǒng)上。
MapReduce的一個重要理念就是“計算向數(shù)據(jù)靠攏”,而不是傳統(tǒng)的“數(shù)據(jù)向計算靠攏”。
MapReduce框架采用了master/slave架構(gòu),包括一個master和若干個slave,master上運行作業(yè)跟蹤器JobTracker,負(fù)責(zé)整個作業(yè)的調(diào)度和處理以及失敗和恢復(fù),slave上運行負(fù)責(zé)具體任務(wù)執(zhí)行的組件TaskTracker,負(fù)責(zé)接受JobTracke發(fā)給它的作業(yè)處理指令,完成具體的任務(wù)處理。
map函數(shù)的輸入為<k,v>鍵值對,每一個輸入的<k,v>鍵值對會輸出一批<k2,v2>中間結(jié)果。
reduce函數(shù)的輸入為<k,list(v)>,輸出為<k,v>鍵值對。list(v)表示一批屬于同一個k的value。
二 MapReduce體系結(jié)構(gòu)
MapReduce的體系結(jié)構(gòu)包括:
- Client 客戶端。
用戶編寫的MapReduce程序通過Client提交到JobTracker端 ,用戶可通過Client提供的一些接口查看當(dāng)前提交作業(yè)的運行狀態(tài)。
- JobTracker 作業(yè)跟蹤器。
JobTracker負(fù)責(zé)資源監(jiān)控和作業(yè)調(diào)度。
JobTracker 監(jiān)控所有TaskTracker與Job的健康狀況,一旦發(fā)現(xiàn)失敗,就將相應(yīng)的任務(wù)轉(zhuǎn)移到其他節(jié)點
JobTracker負(fù)責(zé)任務(wù)的調(diào)度,即將不同的Task分派到相應(yīng)的TaskTracker中。
JobTracker 會跟蹤任務(wù)的執(zhí)行進(jìn)度、資源使用量等信息,并將這些信息發(fā)送給TaskScheduler,而調(diào)度器會在資源出現(xiàn)空閑時, 選擇合適的任務(wù)去使用這些資源
- TaskScheduler 任務(wù)調(diào)度器
負(fù)責(zé)任務(wù)的調(diào)度,即將不同的Task分派到相應(yīng)的TaskTracker中。
- TaskTracker?
TaskTracker會周期性地通過“心跳”將本節(jié)點上資源的使用情況和任務(wù)的運行進(jìn)度匯報給JobTracker,同時接收J(rèn)obTracker 發(fā)送過來的命令并執(zhí)行相應(yīng)的操作(如啟動新任務(wù)、殺死任務(wù)等) 。
TaskTracker 使用“slot”等量劃分本節(jié)點上的資源量(CPU、內(nèi)存等)。 一個Task 獲取到一個slot 后才有機會運行,而Hadoop調(diào)度器的作用就是將各個TaskTracker上的空閑slot分配給Task使用。slot 分為Map slot 和 Reduce slot 兩種,分別供MapTask 和Reduce Task 使用,兩者不通用。
- Task?
Task 分為Map Task 和Reduce Task 兩種,在一臺機器上可以同時運行兩種任務(wù),均由TaskTracker啟動。
三 MapReduce工作流程
不同的map任務(wù)之間不會進(jìn)行通信。
不同的Reduce任務(wù)之間不會發(fā)生任何信息交換。
用戶不能顯式地從一臺機器向另一臺機器發(fā)送消息。
所有的數(shù)據(jù)交換都是通過MapReduce框架自身去實現(xiàn)。
1)?MapReduce?框架使用?InputFormat模塊做Ma前的預(yù)處理,比如驗證輸入的格式是否符合輸入定義;然后,將輸入文件切分為邏輯上的多個?InputSplit。?InputSplit是?MapReduce對文件進(jìn)行處理和運算的輸入單位,只是一個邏輯概念,每個?InputSplit并沒有對文件進(jìn)行實際切分,只是記錄了要處理的數(shù)據(jù)的位置和長度
2)因為?InputSplit是邏輯切分而非物理切分,所以還需要通過?RecordReader(RR)根據(jù)InputSplit中的信息來處理?InputSplit中的具體記錄,加載數(shù)據(jù)并將其轉(zhuǎn)換為適合Map任務(wù)讀取的鍵值對,輸入給Map任務(wù)
3)Map任務(wù)會根據(jù)用戶自定義的映射規(guī)則,輸出一系列的<key,value>作為中間結(jié)果
4)為了讓Reduce可以并行處理Map的結(jié)果,需要對Map的輸出進(jìn)行一定的分區(qū)(Partition)、排序(Sort)、合并(Combine)、歸并(Merge)等操作,得到<key,value-list>形式的中間結(jié)果,再交給對應(yīng)的Reduce來處理,這個過程稱為Shuffle。
5)Reduce以一系列<key,value-list>中間結(jié)果作為輸入,執(zhí)行用戶定義的邏輯,輸出結(jié)果交給OutputFormat模塊。
6)OutputFormat?模塊會驗證輸出目錄是否已經(jīng)存在,以及輸出結(jié)果類型是否符合配置文件中的配置類型,如果都滿足,就輸出Reduce的結(jié)果到分布式文件系統(tǒng)。
本篇我們簡單介紹了MapReduce模型及其工作流程,下面我們會借助章魚大數(shù)據(jù)平臺完成我們的第一個MapReduce練習(xí),通過代碼編寫進(jìn)一步理解MapReduce的原理及流程。