版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第五章Hadoop云平臺(tái)內(nèi)容5.1并行計(jì)算概述5.2Hadoop概述5.3HDFS(HadoopDistributedFileSystem)5.4MapReduce5.5HBase5.6Zookeeper5.7Hadoop的程序?qū)嵗\(yùn)行與分析5.1并行計(jì)算概述5.1.1并行計(jì)算定義5.1.2并行計(jì)算的體系結(jié)構(gòu)5.1.3集群計(jì)算5.1.4并行計(jì)算的進(jìn)程模型5.1.5并行編程模型5.1.6并行計(jì)算發(fā)展階段5.1.1并行計(jì)算定義并行計(jì)算是相對(duì)于串行計(jì)算而言的,它的基本思路是用多個(gè)處理器來(lái)同時(shí)協(xié)調(diào)求解一個(gè)問(wèn)題,即將需要求解的問(wèn)題分解成若干個(gè)部分,各部分分配給一個(gè)獨(dú)立的處理機(jī)來(lái)進(jìn)行并行計(jì)算。在分類(lèi)上可分為時(shí)間上的并行和空間上的并行。時(shí)間上的并行就是指流水線技術(shù),而空間上的并行則是指用多個(gè)處理器并發(fā)的執(zhí)行計(jì)算。并行計(jì)算的研究得益于科學(xué)計(jì)算問(wèn)題,但目前以MapReduce為代表的分割數(shù)據(jù)型并行計(jì)算在商業(yè)領(lǐng)域也得到廣泛應(yīng)用。5.1.2并行計(jì)算的體系結(jié)構(gòu)目前,主要的并行計(jì)算體系結(jié)構(gòu)有以下四種:對(duì)稱(chēng)多處理(SMP:SymmetricalMulti-Processing):它由處理單元、高速緩存、總線或交叉開(kāi)關(guān)、共享內(nèi)存以及I/0等組成。大規(guī)模并行處理(MPP:MassivelyParallelProcessing):它是并行計(jì)算機(jī)發(fā)展過(guò)程中的主力,現(xiàn)在已經(jīng)發(fā)展到由上萬(wàn)個(gè)處理機(jī)構(gòu)成一個(gè)系統(tǒng)。分布式共享存儲(chǔ)多處理(DSM:DistributedShared-Memory):它較好地改善了SMP的可擴(kuò)展能力,是目前高性能計(jì)算機(jī)的主流發(fā)展方向之一。集群(Cluster):Linux平臺(tái)的集群系統(tǒng)己成為最流行的高性能計(jì)算平臺(tái),在高性能計(jì)算機(jī)中占有越來(lái)越大的比重,系統(tǒng)規(guī)??蓮膯螜C(jī)、少數(shù)幾臺(tái)聯(lián)網(wǎng)的微機(jī)直到包括上千個(gè)節(jié)點(diǎn)的大規(guī)模并行系統(tǒng),既可作為廉價(jià)的并行程序調(diào)試環(huán)境,也可設(shè)計(jì)成真正的高性能計(jì)算機(jī)。SMP系統(tǒng)與MPP系統(tǒng)比較SMP(SymmetricMultiProcessing),對(duì)稱(chēng)多處理系統(tǒng)內(nèi)有許多緊耦合多處理器,在這樣的系統(tǒng)中,所有的CPU共享全部資源,如總線,內(nèi)存和I/O系統(tǒng)等,操作系統(tǒng)或管理數(shù)據(jù)庫(kù)的復(fù)本只有一個(gè),這種系統(tǒng)有一個(gè)最大的特點(diǎn)就是共享所有資源。對(duì)稱(chēng)性:系統(tǒng)中任何處理器均可以訪問(wèn)任何存儲(chǔ)單元和I/O設(shè)備。SMP系統(tǒng)與MPP系統(tǒng)比較MPP(MassivelyParallelProcessing),大規(guī)模并行處理系統(tǒng),這樣的系統(tǒng)是由許多松耦合的處理單元組成的,要注意的是這里指的是處理單元而不是處理器。每個(gè)單元內(nèi)的CPU都有自己私有的資源,如總線,內(nèi)存,硬盤(pán)等。在每個(gè)單元內(nèi)都有操作系統(tǒng)和管理數(shù)據(jù)庫(kù)的實(shí)例復(fù)本。這種結(jié)構(gòu)最大的特點(diǎn)在于不共享資源。理想的共享存儲(chǔ)多處理器基于總線的DSM多處理器結(jié)構(gòu)帶緩存的多處理器結(jié)構(gòu)概念集群(Cluster)是一種分布式處理系統(tǒng),由很多連接在一起的獨(dú)立計(jì)算機(jī)節(jié)點(diǎn)組成,像一個(gè)單獨(dú)集成的計(jì)算機(jī)資源一樣協(xié)同工作。計(jì)算機(jī)節(jié)點(diǎn)可以是物理上集中在一起的,也可以是物理上分散而通過(guò)LAN連結(jié)在一起的。一個(gè)連接在一起(LAN基礎(chǔ)上)的計(jì)算機(jī)集群對(duì)于用戶(hù)和應(yīng)用程序來(lái)說(shuō)像一個(gè)單一的系統(tǒng),這樣的系統(tǒng)可以提供一種價(jià)格合理且性能快速而可靠的解決方案。
集群特點(diǎn)集群計(jì)算主要有以下幾個(gè)特點(diǎn):集群技術(shù)支持混合平臺(tái)工作模式,體系結(jié)構(gòu)上可以同時(shí)支持RISC和IA節(jié)點(diǎn),操作系統(tǒng)上可以同時(shí)支持WindowsServer、LINUX、Unix等操作系統(tǒng)。集群技術(shù)具有統(tǒng)一的系統(tǒng)監(jiān)控和管理功能,可以簡(jiǎn)單直觀的監(jiān)控到整個(gè)集群的軟硬件運(yùn)行狀態(tài),同時(shí)通過(guò)集群的主機(jī)入侵檢測(cè)系統(tǒng)保障系統(tǒng)的安全性。特點(diǎn)集群計(jì)算主要有以下幾個(gè)特點(diǎn):集群技術(shù)的架構(gòu)具有優(yōu)異的動(dòng)態(tài)擴(kuò)展性,可以根據(jù)用戶(hù)應(yīng)用的需要,隨時(shí)增加新的節(jié)點(diǎn),而不必改動(dòng)整個(gè)集群系統(tǒng)。集群服務(wù)器節(jié)點(diǎn)可以根據(jù)不同的需要,靈活的進(jìn)行調(diào)整和配置,承擔(dān)不同的應(yīng)用服務(wù)、計(jì)算任務(wù),或通過(guò)軟件管理協(xié)同處理某一特定任務(wù)。
分類(lèi)集群的分類(lèi)和工作原理按照側(cè)重點(diǎn)的不同,可以把集群分為三類(lèi):高可用性集群
負(fù)載均衡集群
超級(jí)計(jì)算集群
可用性計(jì)算機(jī)系統(tǒng)的可用性定義為:MTTF/(MTTF+MTTR)*100%平均無(wú)故障時(shí)間(MTTF):計(jì)算機(jī)系統(tǒng)平均能夠正常運(yùn)行多長(zhǎng)時(shí)間,才發(fā)生一次故障平均維修時(shí)間(MTTR):系統(tǒng)發(fā)生故障后維修和重新恢復(fù)正常運(yùn)行平均花費(fèi)的時(shí)間由此可見(jiàn),計(jì)算機(jī)系統(tǒng)的可用性定義為系統(tǒng)保持正常運(yùn)行時(shí)間的百分比。可用性計(jì)算機(jī)產(chǎn)業(yè)界通常用如下表所示的"9"的個(gè)數(shù)來(lái)劃分計(jì)算機(jī)系統(tǒng)可用性的類(lèi)型??捎眯苑诸?lèi)可用水平每年停機(jī)時(shí)間容錯(cuò)可用性99.9999<1min極高可用性99.9995min具有故障自動(dòng)恢復(fù)能力的可用性99.9953min高可用性99.98.8h商品可用性9943.8h高可用性集群高可用性集群運(yùn)行于兩個(gè)或多個(gè)節(jié)點(diǎn)上,目的是在系統(tǒng)出現(xiàn)某些故障的情況下,仍能繼續(xù)對(duì)外提供服務(wù)。高可用性集群的設(shè)計(jì)思想就是要最大限度地減少服務(wù)中斷時(shí)間。高可用性集群能適用于提供動(dòng)態(tài)數(shù)據(jù)的服務(wù),是由于集群中的節(jié)點(diǎn)共享同一存儲(chǔ)介質(zhì),如磁盤(pán)陣列。也就是說(shuō),在高可用性集群內(nèi),每種服務(wù)的用戶(hù)數(shù)據(jù)只有一份,存儲(chǔ)在共用存儲(chǔ)設(shè)備上,在任一時(shí)刻只有一個(gè)節(jié)點(diǎn)能讀寫(xiě)這份數(shù)據(jù)
兩節(jié)點(diǎn)集群典型結(jié)構(gòu)系統(tǒng)組成兩臺(tái)節(jié)點(diǎn)服務(wù)器節(jié)點(diǎn)可以是一個(gè)單處理器(PC、工作站)或多處理器的系統(tǒng)(共享存儲(chǔ)的多處理機(jī)),擁有內(nèi)存、I/O設(shè)備和操作系統(tǒng)。集群管理軟件實(shí)現(xiàn)集群功能需要集群軟件。如TurbolinuxTurboHA,或者與MSWindowsServer集成在一起的集群軟件MSCS(MicrosoftClusterServer),或者如IBM的HACMP軟件,HP的MCServiceGuard。共享存儲(chǔ)設(shè)備如磁盤(pán)陣列等。用來(lái)存儲(chǔ)大量的由各節(jié)點(diǎn)共享的數(shù)據(jù)。存儲(chǔ)設(shè)備通過(guò)I/O控制卡和相應(yīng)的傳輸介質(zhì)連接到節(jié)點(diǎn)。系統(tǒng)組成心跳鏈路(HeartbeatLink)用來(lái)實(shí)現(xiàn)集群中兩個(gè)節(jié)點(diǎn)之間的直接高速互連,并交換信息??梢酝ㄟ^(guò)RS232線纜實(shí)現(xiàn),也可通過(guò)內(nèi)部連接網(wǎng)卡以雙絞線方式實(shí)現(xiàn)。網(wǎng)絡(luò)鏈路用來(lái)與網(wǎng)絡(luò)交換機(jī)相連,并進(jìn)一步連接到所有的客戶(hù)端設(shè)備,從而使各個(gè)客戶(hù)端能夠訪問(wèn)集群的資源。
高可用性集群工作過(guò)程舉例以Linux環(huán)境為例,集群中有兩個(gè)節(jié)點(diǎn)A和B,設(shè)這個(gè)集群只提供Oracle服務(wù),用戶(hù)數(shù)據(jù)存放于共用存儲(chǔ)設(shè)備的分區(qū)/dev/sdb3上。在正常狀態(tài)下,節(jié)點(diǎn)A提供Oracle數(shù)據(jù)庫(kù)服務(wù),分區(qū)/dev/sdb3被節(jié)點(diǎn)A加載在/mnt/oracle上。當(dāng)系統(tǒng)出現(xiàn)某種故障并被TurboHA軟件檢測(cè)到時(shí),TurboHA會(huì)將Oracle服務(wù)停止,并把分區(qū)/dev/sdb3卸載。之后,節(jié)點(diǎn)B上的TurboHA軟件將在節(jié)點(diǎn)B上加載該分區(qū),并啟動(dòng)Oracle服務(wù)。對(duì)于Oracle服務(wù)有一個(gè)虛擬的IP地址,當(dāng)Oracle服務(wù)從節(jié)點(diǎn)A切換到節(jié)點(diǎn)B上時(shí),虛擬的IP地址也會(huì)隨之綁定到節(jié)點(diǎn)B上,因此用戶(hù)仍可訪問(wèn)此服務(wù)。負(fù)載均衡集群負(fù)載均衡集群目的是提供和節(jié)點(diǎn)個(gè)數(shù)成正比的負(fù)載能力,這種集群很適合提供大訪問(wèn)量的Web服務(wù)。負(fù)載均衡集群往往也具有一定的高可用性特點(diǎn)。負(fù)載均衡集群適用于提供相對(duì)靜態(tài)的數(shù)據(jù)的服務(wù),比如HTTP服務(wù)。因?yàn)橥ǔX?fù)載均衡集群的各節(jié)點(diǎn)間沒(méi)有共用的存儲(chǔ)介質(zhì),用戶(hù)數(shù)據(jù)被復(fù)制成多份,存放于每一個(gè)提供該項(xiàng)服務(wù)的節(jié)點(diǎn)上。TurbolinuxClusterServer負(fù)載均衡集群的工作機(jī)制下面以TurbolinuxClusterServer為例簡(jiǎn)要介紹一下負(fù)載均衡集群的工作機(jī)制。在集群中有一個(gè)主控節(jié)點(diǎn),稱(chēng)為高級(jí)流量管理器(ATM)。假設(shè)這一集群僅被用來(lái)提供一項(xiàng)HTTP服務(wù),其余各節(jié)點(diǎn)均被設(shè)定為HTTP的服務(wù)節(jié)點(diǎn)。用戶(hù)對(duì)于頁(yè)面的請(qǐng)求全部發(fā)送到ATM上,因?yàn)锳TM上綁定了這項(xiàng)服務(wù)對(duì)外的IP地址。ATM把接受到的請(qǐng)求再平均發(fā)送到各服務(wù)節(jié)點(diǎn)上,服務(wù)節(jié)點(diǎn)接收到請(qǐng)求之后,直接把相應(yīng)的Web頁(yè)面發(fā)送給用戶(hù)。負(fù)載均衡集群的工作機(jī)制這樣一來(lái),假如在1秒內(nèi)有1000個(gè)HTTP頁(yè)面請(qǐng)求,而集群中有10個(gè)服務(wù)節(jié)點(diǎn),則每個(gè)節(jié)點(diǎn)將處理100個(gè)請(qǐng)求。這樣,在外界看來(lái),好象有一臺(tái)10倍速度的高速計(jì)算機(jī)在處理用戶(hù)的訪問(wèn)。這也就是真正意義上的負(fù)載均衡。負(fù)載均衡集群的工作機(jī)制但是ATM要處理所有1000個(gè)頁(yè)面請(qǐng)求,它會(huì)不會(huì)成為集群處理速度的瓶頸呢?由于對(duì)于頁(yè)面請(qǐng)求的數(shù)據(jù)量相對(duì)較少,返回頁(yè)面內(nèi)容的數(shù)據(jù)量相對(duì)較大,因此這種方式還是很有效率的。ATM發(fā)生故障,也不會(huì)導(dǎo)致整個(gè)系統(tǒng)無(wú)法工作。TurbolinuxClusterServer可以設(shè)置一臺(tái)或多臺(tái)計(jì)算機(jī)為后備ATM節(jié)點(diǎn),當(dāng)主ATM節(jié)點(diǎn)故障時(shí),在后備ATM中會(huì)產(chǎn)生出一個(gè)新的主ATM,接替它的工作??梢钥闯?,這種負(fù)載均衡集群也具有一定的高可用性。
TurboCluster中采用的調(diào)度策略有:輪回(RoundRobin)、加權(quán)輪回(WeightedRoundRobin)、最少連接(LeastConnection)兩者的結(jié)合高可用性集群對(duì)一種服務(wù)而言不具有負(fù)載均衡功能,它可以提高整個(gè)系統(tǒng)的可靠性,但不能增加負(fù)載的能力。當(dāng)然,高可用性集群可以運(yùn)行多種服務(wù),并將其適當(dāng)分配在不同節(jié)點(diǎn)上,比如節(jié)點(diǎn)A提供Oracle服務(wù),同時(shí)節(jié)點(diǎn)B提供Sybase服務(wù),這也可以看成是某種意義上的負(fù)載均衡,不過(guò)這是對(duì)多種服務(wù)的分配而言
對(duì)于同一種服務(wù),是不能同時(shí)獲得高可用性與負(fù)載均衡能力的。對(duì)一種服務(wù),要么是只有一份數(shù)據(jù),放在共用存儲(chǔ)設(shè)備上,一次被一個(gè)節(jié)點(diǎn)訪問(wèn),獲得高可用性;要么是把數(shù)據(jù)復(fù)制為多份,存儲(chǔ)于每個(gè)節(jié)點(diǎn)的本地硬盤(pán)上,用戶(hù)的請(qǐng)求同時(shí)發(fā)送到多個(gè)節(jié)點(diǎn)上,獲得負(fù)載均衡能力超級(jí)計(jì)算集群超級(jí)計(jì)算集群。按照計(jì)算關(guān)聯(lián)程度的不同,又可以分為兩種:一種是任務(wù)片方式,要把計(jì)算任務(wù)分成任務(wù)片,再把任務(wù)片分配給各節(jié)點(diǎn),在各節(jié)點(diǎn)上分別計(jì)算后再把結(jié)果匯總,生成最終計(jì)算結(jié)果;另一種是并行計(jì)算方式,節(jié)點(diǎn)之間在計(jì)算過(guò)程中大量地交換數(shù)據(jù),可以進(jìn)行具有強(qiáng)耦合關(guān)系的計(jì)算。這兩種超級(jí)計(jì)算集群分別適用于不同類(lèi)型的數(shù)據(jù)處理工作。有了超級(jí)計(jì)算集群軟件,企業(yè)利用若干臺(tái)PC機(jī)就可以完成通常只有超級(jí)計(jì)算機(jī)才能完成的計(jì)算任務(wù)
云計(jì)算系統(tǒng)的資源組織方式云計(jì)算系統(tǒng)的資源組織方式有兩種虛擬機(jī)方式利用虛擬化技術(shù),在物理服務(wù)器抽象出能夠被上層使用的虛擬化服務(wù)器,以屏蔽底層硬件差異的影響,并提高資源的利用率。其上的執(zhí)行環(huán)境與傳統(tǒng)PC系統(tǒng)相同,通常在IaaS服務(wù)中提供分布式集群方式分布式集群方式分布式集群方式的原理是首先由云操作系統(tǒng)組織一批物理服務(wù)器或者虛擬服務(wù)器構(gòu)成集群,然后再在集群上部署分布式軟件系統(tǒng)作為上層軟件的開(kāi)發(fā)和執(zhí)行環(huán)境,包括分布式集群管理分布式程序開(kāi)發(fā)環(huán)境分布式文件系統(tǒng)分布式數(shù)據(jù)庫(kù)等等兩種資源組織方式比較虛擬化架構(gòu)雖然也可用于整合分布式的服務(wù)器節(jié)點(diǎn),但其思想是一種“分裂”思想,也就是把服務(wù)器“分裂”成多臺(tái)虛擬機(jī)來(lái)調(diào)度;而分布式集群架構(gòu)則側(cè)重于“聚合”各個(gè)服務(wù)器的資源,輸出一種新的“計(jì)算”和“存儲(chǔ)”能力?;ヂ?lián)網(wǎng)公司(如Google\Hadoop)采用分布式集群架構(gòu)的比例更高;企業(yè)私有云(如IBM\VMware\MicrosoftAzure\AmazonEC2\OpenStack)則以虛擬化技術(shù)的應(yīng)用為主。5.1.4并行計(jì)算的進(jìn)程模型主從模式(Master-slave):有一個(gè)主進(jìn)程,其它為從進(jìn)程。在這種模式中,主進(jìn)程一般負(fù)責(zé)整個(gè)并行程序的數(shù)據(jù)控制,從進(jìn)程負(fù)責(zé)對(duì)數(shù)據(jù)的處理和計(jì)算任務(wù),當(dāng)然,主進(jìn)程也可以參與對(duì)數(shù)據(jù)的處理和計(jì)算。一般情況下,從進(jìn)程之間不需要發(fā)生數(shù)據(jù)交換,數(shù)據(jù)的交換過(guò)程是通過(guò)主進(jìn)程來(lái)完成的。對(duì)等模式:在這種編程模式中,沒(méi)有哪個(gè)進(jìn)程是主進(jìn)程,每個(gè)進(jìn)程的地位是相同的。對(duì)等模式即參與運(yùn)算的各進(jìn)程地位相同,計(jì)算程序一致,只是處理的數(shù)據(jù)不同。然而,在并行實(shí)現(xiàn)過(guò)程中,我們總是要在這些進(jìn)程中選擇一個(gè)進(jìn)行輸入輸出的進(jìn)程,它扮演的角色和主進(jìn)程類(lèi)似。5.1.5并行編程模型并行編程模型是并行算法和并行計(jì)算機(jī)硬件結(jié)構(gòu)間的橋梁,它用并行編程接口的形式提供給程序開(kāi)發(fā)員,程序開(kāi)發(fā)員通過(guò)這種并行編程接口編寫(xiě)并行程序,從而實(shí)現(xiàn)并行算法。并行編程模型并行編程模型比較流行的是消息傳遞模型MPI(MessagePassingInterface),共享存儲(chǔ)模型OpenMP以及數(shù)據(jù)并行模型。共享存儲(chǔ)模式:以O(shè)penMP為代表,主要是利用添加并行化指令到串行程序中,由編譯器完成自動(dòng)并行化。消息傳遞模式:以MPI為代表,PVM(并行虛擬機(jī),ParallelVirtualMachineComputing)是消息傳遞模式的一個(gè)變種。數(shù)據(jù)并行模式:MapReduce是數(shù)據(jù)并行計(jì)算模型的典范,在云計(jì)算領(lǐng)域被廣泛采用。并行編程模型可以這樣打比方:作并行計(jì)算好比是蓋樓房,你有了MPI就好比是有了砂石,水泥和鋼材,你可以蓋最美的房子,但你必須使用最原始狀態(tài)的原材料,付出可觀的智力勞動(dòng);你有了OpenMP就好比是有了預(yù)制板和各種預(yù)制件,可以非??焖俚卦旆孔?,事半功倍;你有了數(shù)據(jù)并行環(huán)境,可以比作你有了包工頭,很多事情您就可以完全依靠他了。也許比喻方式不是很恰當(dāng),但是三種編程模式的優(yōu)劣、效率是很有差別的,可以不夸張地說(shuō)OpenMP比MPI要容易很多倍。MPIMPI(MessagePassingInterface)是消息傳遞并行程序設(shè)計(jì)的標(biāo)準(zhǔn)之一.MPI正成為并行程序設(shè)計(jì)事實(shí)上的工業(yè)標(biāo)準(zhǔn)。MPI的實(shí)現(xiàn)包括MPICH、LAM、IBMMPL等多個(gè)版本,最常用和穩(wěn)定的是MPICH,曙光天潮系列的MPI以MPICH為基礎(chǔ)進(jìn)行了定制和優(yōu)化。然而,MPI同樣存在著一些不足。由于進(jìn)程的唯一性和顯式消息傳遞的特點(diǎn),加上MPI標(biāo)準(zhǔn)繁瑣,從而使得基于其開(kāi)發(fā)并行程序也相當(dāng)復(fù)雜。在通信上也會(huì)造成很大的開(kāi)銷(xiāo)OpenMPOpenMP提供了對(duì)并行算法的高層的抽象描述,程序員通過(guò)在源代碼中加入專(zhuān)用的pragma來(lái)指明自己的意圖,由此編譯器可以自動(dòng)將程序進(jìn)行并行化,并在必要之處加入同步互斥以及通信。當(dāng)選擇忽略這些pragma,或者編譯器不支持OpenMP時(shí),程序又可退化為通常的程序(一般為串行),代碼仍然可以正常運(yùn)作,只是不能利用多線程來(lái)加速程序執(zhí)行。OpenMPOpenMP支持的編程語(yǔ)言包括C語(yǔ)言、C++和Fortran。要在VisualC++.NET中使用OpenMP其實(shí)不難,只要將Project的Properties中C/C++里L(fēng)anguage的OpenMPSupport開(kāi)啟(參數(shù)為/openmp),就可以讓VC++.NET在編譯時(shí)支持OpenMP的語(yǔ)法了;而在編寫(xiě)使用OpenMP的程序時(shí),則需要先includeOpenMP的頭文件:omp.h兩種并行編程模型特征對(duì)比特征消息傳遞共享存儲(chǔ)典型代表MPIOpenMP適用體系結(jié)構(gòu)所有流行的并行機(jī)SMP,DSM控制流多進(jìn)程多線程數(shù)據(jù)存儲(chǔ)方式分布式共享存儲(chǔ)數(shù)據(jù)分配方式顯式隱式兩種并行編程模型特征對(duì)比消息傳遞模型編寫(xiě)的程序可移植性好,但編程難度系數(shù)大于共享存儲(chǔ)這種編程模型,共享存儲(chǔ)模型編寫(xiě)的程序只適用于SMP(SymmetricalMulti-Processing)和DSM(DistributedShared-Memory)這兩種并行機(jī),可移植性稍微遜色于消息傳遞模型編寫(xiě)的程序,但編程簡(jiǎn)單。兩種并行編程模型特征對(duì)比消息傳遞并行編程能支持進(jìn)程間的分布式存儲(chǔ)模式,即各個(gè)進(jìn)程只能直接訪問(wèn)其局部?jī)?nèi)存空間,而對(duì)其他進(jìn)程的局部?jī)?nèi)存空間的訪問(wèn)只能通過(guò)消息傳遞來(lái)實(shí)現(xiàn)。共享存儲(chǔ)并行編程基于線程級(jí)細(xì)粒度并行,僅被SMP和DSM并行計(jì)算機(jī)所支持,可移植性不如消息傳遞并行編程3)數(shù)據(jù)并行模型從程序和算法設(shè)計(jì)人員的角度來(lái)看,并行計(jì)算又可分為數(shù)據(jù)并行和任務(wù)并行。一般來(lái)說(shuō),因?yàn)閿?shù)據(jù)并行主要是將一個(gè)大任務(wù)化解成相同的各個(gè)子任務(wù),比任務(wù)并行要容易處理。對(duì)于數(shù)據(jù)密集型問(wèn)題,可以采用分割數(shù)據(jù)的分布式計(jì)算模型,把需要進(jìn)行大量計(jì)算的數(shù)據(jù)分割成小塊,由網(wǎng)絡(luò)上的多臺(tái)計(jì)算機(jī)分別計(jì)算,然后把結(jié)果進(jìn)行組合得出數(shù)據(jù)結(jié)論。MapReduce是分割數(shù)據(jù)型并行計(jì)算模型的典范,在云計(jì)算領(lǐng)域被廣泛采用。并行計(jì)算涉及的研究領(lǐng)域包括三方面的主要研究?jī)?nèi)容,即硬件方面并行計(jì)算機(jī)的研究,軟件支持方面并行程序的設(shè)計(jì)與理論基礎(chǔ)方面并行算法的研究并行計(jì)算的研究存在的問(wèn)題并行計(jì)算的研究存在的問(wèn)題主要總結(jié)為4個(gè)方面。(1)對(duì)比并行計(jì)算研究的3個(gè)主要研究?jī)?nèi)容來(lái)看,理論基礎(chǔ)即并行算法的研究相對(duì)比較薄弱;(2)當(dāng)前的并行計(jì)算研究尚未十分成熟,并不能非常有效地利用并行計(jì)算資源;(3)尚未有一門(mén)比較簡(jiǎn)單高效地并行編程語(yǔ)言供程序員使用,也未有比較成熟的開(kāi)發(fā)環(huán)境;(4)并行計(jì)算的硬件基礎(chǔ)并行計(jì)算機(jī)本身有著比較難以管理,可擴(kuò)展性難以保證等困難,目前尚未有比較成熟的管理方法。5.2Hadoop概述5.2.1Hadoop的由來(lái)5.2.2Hadoop的特點(diǎn)5.2.3Hadoop基本結(jié)構(gòu)5.2.4Hadoop的應(yīng)用5.2.1Hadoop的由來(lái)Hadoop源于兩個(gè)開(kāi)源項(xiàng)目Nutch和Lucene。Lucene是一個(gè)高性能全文檢索工具包,是利用Java語(yǔ)言開(kāi)發(fā)的。Lucene并不是一個(gè)應(yīng)用程序,而是一個(gè)簡(jiǎn)單而且容易使用的API庫(kù)。它可以很容易地植入到各種應(yīng)用程序中,從而實(shí)現(xiàn)搜索和索引功能。Hadoop的由來(lái)Nutch是第一個(gè)Web搜索引擎,它在Lucene項(xiàng)目的基礎(chǔ)上增加了一些與Web相關(guān)的功能、網(wǎng)絡(luò)爬蟲(chóng)以及一些需要解析各類(lèi)文檔格式的插件等等,它還包含一個(gè)用來(lái)存儲(chǔ)數(shù)據(jù)的分布式文件系統(tǒng)。從Nutch0.8.0開(kāi)始,Nutch將其中實(shí)現(xiàn)分布式文件系統(tǒng)以及MapReduce算法的代碼獨(dú)立分列出來(lái),從而實(shí)現(xiàn)了一個(gè)新的開(kāi)源項(xiàng)目—Hadoop。Hadoop名字的來(lái)源Hadoop并不是一個(gè)縮寫(xiě)字,而是一個(gè)虛構(gòu)的名字,Hadoop名字的起源是由于Hadoop項(xiàng)目創(chuàng)始人DougCutting,他的孩子為他畫(huà)了一幅剛吃飽的的大象,他借用了孩子為這頭棕黃色大象的命名,這個(gè)名字只是因?yàn)楹?jiǎn)短,發(fā)音容易、拼寫(xiě)簡(jiǎn)單,除此之外沒(méi)有太大的意義。于是Hadoop成為了DougCutting所創(chuàng)立的項(xiàng)目的名字,而這只大象便成為Hadoop的標(biāo)簽。5.2.2Hadoop的特點(diǎn)(1)擴(kuò)容能力。Hadoop的根本特點(diǎn)就是存儲(chǔ)的擴(kuò)展性和計(jì)算的擴(kuò)展性。Hadoop可以擴(kuò)展到數(shù)千甚至數(shù)萬(wàn)個(gè)節(jié)點(diǎn)上。(2)低成本。Hadoop框架無(wú)需昂貴的服務(wù)器,普通PC機(jī)也可正常運(yùn)行。必要時(shí),在你的筆記本上也可以安裝。(3)可靠性高。Hadoop采用的分布式文件系統(tǒng)和MapReduce的任務(wù)監(jiān)控,一定程度上保證了系統(tǒng)的備份恢復(fù)機(jī)制和分布式處理的可靠性。(4)效率高。數(shù)據(jù)交互的高效性以及MapReduce的處理模式,可以在數(shù)據(jù)所在的節(jié)點(diǎn)并行處理,為海量信息的高效處理做了鋪墊。5.2.3Hadoop基本結(jié)構(gòu)PigChukwaHiveHBaseMapReduceHDFSZooKeeperCore(Common)AvroHadoop基本結(jié)構(gòu)(1)Core(Common):一系列分布式文件系統(tǒng)和通用I/O的組件和接口(序列化、JavaRPC和持久化數(shù)據(jù)結(jié)構(gòu))。這是整個(gè)Hadoop項(xiàng)目的核心,其他的Hadoop子項(xiàng)目都是在HadoopCommon的基礎(chǔ)上發(fā)展的。(2)Avro:Hadoop的RPC(remoteprocedurecall遠(yuǎn)程過(guò)程調(diào)用)方案。是一種提供高效,跨語(yǔ)言RPC的數(shù)據(jù)序列系統(tǒng),持久化數(shù)據(jù)存儲(chǔ)。Hadoop基本結(jié)構(gòu)(3)Chukwa:分布式數(shù)據(jù)收集和分析系統(tǒng),Chukwa運(yùn)行HDFS中存儲(chǔ)數(shù)據(jù)的收集器,它使用MapReduce來(lái)生成報(bào)告。是一個(gè)用來(lái)管理大型分布式系統(tǒng)的數(shù)據(jù)采集系統(tǒng)。(4)HBase:一個(gè)分布式,列存儲(chǔ)數(shù)據(jù)庫(kù)。HBase使用HDFS作為底層存儲(chǔ),同時(shí)支持MapReduce的批量式計(jì)算和點(diǎn)查詢(xún)。是支持結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)的分布式數(shù)據(jù)庫(kù),Google的BigTable的開(kāi)源實(shí)現(xiàn)。Hadoop基本結(jié)構(gòu)(5)HDFS:是一個(gè)高吞吐量、高容錯(cuò)性、高可靠性的分布式文件系統(tǒng),是Google的文件系統(tǒng)GFS的開(kāi)源實(shí)現(xiàn)。(6)Hive:提供數(shù)據(jù)摘要和查詢(xún)功能的分布式數(shù)據(jù)倉(cāng)庫(kù),Hive管理HDFS中存儲(chǔ)的數(shù)據(jù),并提供基于SQL的查詢(xún)語(yǔ)言用于查詢(xún)數(shù)據(jù)。Hive是數(shù)據(jù)查詢(xún)的接口而不是數(shù)據(jù)本身,HBase則用于存儲(chǔ)數(shù)據(jù)本身,Hive可以和HBase一起工作(7)MapReduce:大型數(shù)據(jù)的分布式處理模型。是分布式數(shù)據(jù)處理模式和執(zhí)行環(huán)境,運(yùn)行于大型商用機(jī)集群。它是Google的MapReduce的開(kāi)源實(shí)現(xiàn)。Hadoop基本結(jié)構(gòu)(8)Pig:在MapReduce上構(gòu)建的一種高級(jí)的數(shù)據(jù)流語(yǔ)言。是一種數(shù)據(jù)流語(yǔ)言和運(yùn)行環(huán)境,用于檢索非常大的數(shù)據(jù)集。Pig運(yùn)行在MapReduce和HDFS的集群上。它是Google的Sawzall的開(kāi)源實(shí)現(xiàn)。它更適用于批處理任務(wù),而不適用于需要快速響應(yīng)的任務(wù);這個(gè)數(shù)據(jù)模型更適用于處理流式訪問(wèn),而不是隨機(jī)訪問(wèn)。(9)ZooKeeper:
用于解決分布式系統(tǒng)中一致性問(wèn)題。是一個(gè)分布式的,高可用性的協(xié)調(diào)服務(wù)。ZooKeeper提供分布式鎖之類(lèi)的基本服務(wù)用于構(gòu)建分布式應(yīng)用。它是Google的Chubby的開(kāi)源實(shí)現(xiàn)。Hadoop與GoogleHadoop云計(jì)算系統(tǒng)Google云計(jì)算系統(tǒng)HadoopHDFSGoogleGFSHadoopMapReduceGoogleMapReduceHadoopHBaseGoogleBigtableHadoopZooKeeperGoogleChubbyHadoopPigGoogleSawzall5.2.4Hadoop的應(yīng)用(1).Hadoop在阿里巴巴:用于商業(yè)數(shù)據(jù)處理和排序,并將Hadoop應(yīng)用到阿里巴巴的ISEARCH搜索引擎和垂直商業(yè)搜索引擎。節(jié)點(diǎn)數(shù):15臺(tái)機(jī)器的構(gòu)成的集群;服務(wù)器配置:32G內(nèi)存,16核CPU,2T硬盤(pán)容量。(2).Hadoop在百度:主要應(yīng)用于日志分析,同時(shí)使用Hadoop做一些網(wǎng)頁(yè)數(shù)據(jù)的數(shù)據(jù)挖掘工作。節(jié)點(diǎn)數(shù)::0一600個(gè)節(jié)點(diǎn);周數(shù)據(jù)量:3000TB。Hadoop的應(yīng)用(3).Hadoop在Facebook:主要用于內(nèi)部日志的拷貝,同樣用于處理數(shù)據(jù)挖掘和日志統(tǒng)計(jì)。硬件環(huán)境主要使用了2個(gè)集群:一個(gè)是由1200臺(tái)節(jié)點(diǎn)組成的集群,每臺(tái)機(jī)器8核,每臺(tái)機(jī)器12T硬盤(pán);一個(gè)是由400臺(tái)節(jié)點(diǎn)組成的集群,包括2500核CPU,和4000T的原始存儲(chǔ)數(shù)據(jù)。并且由Hadoop基礎(chǔ)上開(kāi)發(fā)了基于SQL語(yǔ)法的項(xiàng)目——Hive。(4).Hadoop在HULU:主要用于日志的分析和存儲(chǔ)。節(jié)點(diǎn)數(shù):由14臺(tái)機(jī)器構(gòu)成的集群(8核CPU,單臺(tái)機(jī)器是4TB硬盤(pán));并且開(kāi)發(fā)了基于HBase的數(shù)據(jù)庫(kù)。Hadoop的應(yīng)用(5).Hadoop在Twitter:主要用于存儲(chǔ)微博數(shù)據(jù)、日志以及許多中間數(shù)據(jù);并且開(kāi)發(fā)了基于Hadoop構(gòu)建的Cloudera'SCDH2系統(tǒng),存儲(chǔ)壓縮后的數(shù)據(jù)文件(LZO格式)。(6)Hadoop在雅虎:主要用于支持廣告系統(tǒng)存儲(chǔ)及網(wǎng)頁(yè)數(shù)據(jù)搜索與分析。節(jié)點(diǎn)數(shù):26000臺(tái)機(jī)器,CPU:8核;集群機(jī)器數(shù):6000個(gè)節(jié)點(diǎn)(4*2CPU,1*4TB磁盤(pán),8GB內(nèi)存)5.3HDFS5.3.1HDFS的功能5.3.2HDFS的結(jié)構(gòu)5.3.3HDFS文件讀寫(xiě)操作流程5.3.4HDFS如何實(shí)現(xiàn)可靠存儲(chǔ)、副本管理5.3.1HDFS的功能設(shè)計(jì)前提與目標(biāo)硬件錯(cuò)誤是常態(tài)而不是異常流式數(shù)據(jù)訪問(wèn)
超大規(guī)模數(shù)據(jù)集
簡(jiǎn)單一致性模型
移動(dòng)計(jì)算比移動(dòng)數(shù)據(jù)更簡(jiǎn)單
異構(gòu)軟硬件平臺(tái)間的可移植性
5.3.2HDFS的結(jié)構(gòu)HDFS的結(jié)構(gòu)HDFS有三個(gè)重要角色:NameNode(名字節(jié)點(diǎn))、DataNode(數(shù)據(jù)節(jié)點(diǎn))和Client(客戶(hù)端)。一個(gè)HDFS集群由一個(gè)NameNode和一定數(shù)目的DataNode組成,NameNode管理文件系統(tǒng)的元數(shù)據(jù)(Meta-data),DataNode存儲(chǔ)實(shí)際的數(shù)據(jù)。Client是僅需要獲取分布式文件系統(tǒng)文件的應(yīng)用程序。HDFS的結(jié)構(gòu)NameNode是一個(gè)主控服務(wù)器,負(fù)責(zé)管理分布式文件系統(tǒng)的命名空間(NameSpace)、集群配置信息、存儲(chǔ)塊的復(fù)制以及客戶(hù)端對(duì)文件的訪問(wèn)。集群中的DataNode一般是一個(gè)節(jié)點(diǎn)一個(gè),負(fù)責(zé)管理它所在節(jié)點(diǎn)上的數(shù)據(jù)存儲(chǔ)以及客戶(hù)端的訪問(wèn)。它存儲(chǔ)Block(數(shù)據(jù)塊)于本地文件系統(tǒng)中,同時(shí)周期性的發(fā)送所有存在的Block的報(bào)告給NameNode。HDFS的結(jié)構(gòu)HDFS暴露了文件系統(tǒng)的命名空間,用戶(hù)能夠以文件的形式在上面存儲(chǔ)數(shù)據(jù)。從內(nèi)部看,一個(gè)文件其實(shí)被分成一個(gè)或多個(gè)數(shù)據(jù)塊,這些塊存儲(chǔ)在一組DataNode上。NameNode執(zhí)行文件系統(tǒng)的命名空間操作,比如打開(kāi)、關(guān)閉、重命名文件或目錄。它也負(fù)責(zé)確定數(shù)據(jù)塊到具體DataNode節(jié)點(diǎn)的映射。DataNode負(fù)責(zé)處理文件系統(tǒng)客戶(hù)端的讀寫(xiě)請(qǐng)求。在NameNode的統(tǒng)一調(diào)度下進(jìn)行數(shù)據(jù)塊的創(chuàng)建、刪除和復(fù)制。5.3.3HDFS文件讀寫(xiě)操作流程HDFS的數(shù)據(jù)訪問(wèn)模式是“一次寫(xiě)入、多次讀取”,這種模式是最高效的。讀取過(guò)程讀取過(guò)程(l)客戶(hù)端通過(guò)Filesystem對(duì)象的open()方法來(lái)打開(kāi)希望讀取的文件。(2)分布式文件系統(tǒng)通過(guò)RPC來(lái)調(diào)用名字節(jié)點(diǎn)(Namenode),來(lái)確定文件開(kāi)頭部分?jǐn)?shù)據(jù)塊的位置。(3)客戶(hù)端對(duì)FSDatalnputstream輸入流調(diào)用read()方法。讀取過(guò)程(4)FSDatalnputstream對(duì)象隨即與存儲(chǔ)著文件開(kāi)頭部分的塊的數(shù)據(jù)節(jié)點(diǎn)相連,通過(guò)在數(shù)據(jù)流中反復(fù)調(diào)用read()方法,數(shù)據(jù)就會(huì)從數(shù)據(jù)節(jié)點(diǎn)返回到客戶(hù)端。(5)當(dāng)讀取到塊的最后一端時(shí),F(xiàn)SDatalnputstream就會(huì)關(guān)閉與數(shù)據(jù)節(jié)點(diǎn)間的聯(lián)系。然后為下一塊找到最佳的數(shù)據(jù)節(jié)點(diǎn)。(6)當(dāng)客戶(hù)端讀取完畢時(shí),就會(huì)對(duì)文件系統(tǒng)輸入數(shù)據(jù)流調(diào)用close()方法寫(xiě)入過(guò)程寫(xiě)入過(guò)程(1)客戶(hù)端通過(guò)Filesystem對(duì)象的create()方法來(lái)創(chuàng)建希望寫(xiě)入的文件。(2)分布式文件系統(tǒng)通過(guò)RPC來(lái)調(diào)用名字節(jié)點(diǎn)(Namenode),并在文件系統(tǒng)的命名空間中創(chuàng)建一個(gè)新文件(3)客戶(hù)端對(duì)寫(xiě)入數(shù)據(jù)調(diào)用write()方法。寫(xiě)入過(guò)程(4)FSDataOutputstream將客戶(hù)寫(xiě)入的數(shù)據(jù)分成一個(gè)個(gè)的包(writepacket),寫(xiě)入內(nèi)部的數(shù)據(jù)隊(duì)列,然后隊(duì)列中的數(shù)據(jù)流依次寫(xiě)入到由數(shù)據(jù)節(jié)點(diǎn)組成的管線中.(5)FSDataOutputstream有一個(gè)內(nèi)部的包隊(duì)列來(lái)等待數(shù)據(jù)節(jié)點(diǎn)發(fā)送的確認(rèn)信息(ackpacket),一個(gè)包只有在被管線中的所有節(jié)點(diǎn)確認(rèn)后才被轉(zhuǎn)移出包隊(duì)列(6)當(dāng)客戶(hù)端完成數(shù)據(jù)的寫(xiě)入后,就會(huì)對(duì)數(shù)據(jù)流調(diào)用close()方法。(7)向名字節(jié)點(diǎn)發(fā)送寫(xiě)入完成的信息。5.3.4HDFS如何實(shí)現(xiàn)可靠存儲(chǔ)、副本管理HDFS在對(duì)文件存儲(chǔ)時(shí),首先把文件按照一定的大小分割成一個(gè)或多個(gè)的數(shù)據(jù)塊,數(shù)據(jù)塊默認(rèn)大小為64MB。系統(tǒng)把分割好的數(shù)據(jù)塊存儲(chǔ)在Datanode中.除了最后一個(gè)數(shù)據(jù)塊,分割后的數(shù)據(jù)塊大小都是相同的。HDFS為了實(shí)現(xiàn)節(jié)點(diǎn)故障容錯(cuò),對(duì)文件的數(shù)據(jù)塊實(shí)施副本存儲(chǔ)機(jī)制。在對(duì)HDFS配置文件進(jìn)行設(shè)置時(shí)數(shù)據(jù)塊的副本數(shù)量一般情況下為3。副本存放策略首先是將數(shù)據(jù)塊A放在本地節(jié)點(diǎn),在對(duì)另外兩個(gè)副本存放時(shí),為了充分考慮集群內(nèi)節(jié)點(diǎn)的容錯(cuò)機(jī)制,是將第二個(gè)副本A存儲(chǔ)在機(jī)架1上的另一個(gè)節(jié)點(diǎn)內(nèi),第三個(gè)副本A則存儲(chǔ)到不同的機(jī)架2上的一個(gè)節(jié)點(diǎn)內(nèi)。副本存放策略每個(gè)機(jī)架失效的概率要遠(yuǎn)遠(yuǎn)小于節(jié)點(diǎn)失效的概率。這種數(shù)據(jù)塊副本存儲(chǔ)策略有效的保證了數(shù)據(jù)存儲(chǔ)的可靠性和高效性,又節(jié)省了客戶(hù)端在進(jìn)行讀操作時(shí)所占用的網(wǎng)絡(luò)帶寬(數(shù)據(jù)塊存儲(chǔ)在不同的機(jī)架內(nèi))提升性能的措施
提升性能措施副本選擇HDFS會(huì)盡量使用離程序最近的副本來(lái)滿(mǎn)足用戶(hù)請(qǐng)求,這樣可以減少總帶寬消耗和讀延時(shí)
負(fù)載均衡HDFS的架構(gòu)支持?jǐn)?shù)據(jù)均衡策略客戶(hù)端緩存HDFS客戶(hù)端先把數(shù)據(jù)緩存到本地的一個(gè)臨時(shí)文件,程序的寫(xiě)操作透明地重定向到這個(gè)臨時(shí)文件流水線復(fù)制DataNode從前一個(gè)節(jié)點(diǎn)接收數(shù)據(jù)的同時(shí),即時(shí)把數(shù)據(jù)傳給后面的節(jié)點(diǎn),這就是流水線復(fù)制5.4MapReduce5.4.1MapReduce原理5.4.2MapReduce執(zhí)行流程5.4.3MapReduce數(shù)據(jù)流程5.4.4MapReduce的容錯(cuò)機(jī)制5.4.1MapReduce原理MapReduce基本原理是把輸入看為一組<key,value>對(duì)集,輸出同樣也是一組<key,value>對(duì)集或者是單個(gè)<key,value>.在利用MapReduce編寫(xiě)程序時(shí),程序員只需要關(guān)注兩個(gè)自定義函數(shù):映射(map)函數(shù)和簡(jiǎn)化(reduce)函數(shù)map和reduce函數(shù)函數(shù)
輸入
輸出說(shuō)明map<k1,v1><K2,list(V2)>將數(shù)據(jù)集解析成一批<key,value>對(duì),輸入map函數(shù)中進(jìn)行處理并輸出中間結(jié)果集<k2,v2>reduce<k2,list(v2)><k3,v3>List(v2)表示屬于同一個(gè)k2的valueMapReduce處理的任務(wù)基本要求:待處理的數(shù)據(jù)集可以分解成許多小的數(shù)據(jù)集,而且每一個(gè)小數(shù)據(jù)集都可以完全并行地進(jìn)行處理
映射階段,用戶(hù)輸入的數(shù)據(jù)分割為M個(gè)片斷,對(duì)應(yīng)M個(gè)Map任務(wù)。每一個(gè)Map操作的輸入是數(shù)據(jù)片斷中的鍵值對(duì)<K1,V1>集合,Map操作調(diào)用用戶(hù)定義的Map函數(shù),輸出一個(gè)中間態(tài)的鍵值對(duì)<K2,V2>集合。接著,按照中間態(tài)的K2將輸出的數(shù)據(jù)集進(jìn)行排序,并生成一個(gè)新的<K2,list(V2)>元組,按照K2的范圍將這些元組分割為R個(gè)片斷化簡(jiǎn)階段,每一個(gè)Reduce操作的輸入是一個(gè)<K2,list(V2)>片斷,Reduce操作調(diào)用用戶(hù)定義的Reduce函數(shù),生成用戶(hù)需要的鍵值對(duì)<K3,V3>進(jìn)行輸出并行編程如果說(shuō)并行編程的難度足以讓那些沒(méi)有并行編程經(jīng)驗(yàn)的普通程序員望而卻步的話(huà),開(kāi)源實(shí)現(xiàn)的Hadoop極大的降低了編程的門(mén)檻,通過(guò)學(xué)習(xí)Hadoop,你會(huì)發(fā)現(xiàn)基于Hadoop的并行編程非常簡(jiǎn)單,無(wú)須任何并行編程程序的開(kāi)發(fā)經(jīng)驗(yàn),你也可以輕松的開(kāi)發(fā)出所需要的并行程序,并讓其分布式并行地運(yùn)行在數(shù)百臺(tái)機(jī)器上,然后在很短時(shí)間內(nèi)完成大規(guī)模數(shù)據(jù)的計(jì)算。5.4.2MapReduce執(zhí)行流程MapReduce執(zhí)行流程(1)分割輸入文件:在并行程序中的MapReduce函數(shù)庫(kù)首先將輸入文件分割成M個(gè)塊,每塊的大小一般從16MB到64MB不等(可以通過(guò)參數(shù)自行調(diào)整)。(2)分配map或者reduce任務(wù):在進(jìn)程中有一個(gè)身份比較特殊的進(jìn)程,它是主控程序master。其余都是執(zhí)行map或者reduce任務(wù)的worker(工作機(jī)),并且任務(wù)都是由主控程序分配的。master分別分配給這些workerM個(gè)map任務(wù)與R個(gè)reduce任務(wù)。MapReduce執(zhí)行流程(3)讀取輸入塊:一個(gè)執(zhí)行map任務(wù)的worker節(jié)點(diǎn)讀取相關(guān)輸入塊的內(nèi)容,worker從數(shù)據(jù)中解析出所需要的<key,value>對(duì)集合,并把它們傳送給用戶(hù)自定義的map函數(shù),由map函數(shù)處理這些數(shù)據(jù)集合并產(chǎn)生中間<key,value>對(duì)集,并暫時(shí)把它們緩沖到內(nèi)存中MapReduce執(zhí)行流程(4)本地寫(xiě)入中間結(jié)果:這些緩沖到內(nèi)存的中間<key,value>對(duì)集將被定時(shí)的寫(xiě)入到本地硬盤(pán)(5)遠(yuǎn)程讀取中間結(jié)果:當(dāng)執(zhí)行reduce任務(wù)的worker節(jié)點(diǎn)在本地硬盤(pán)讀取了所有的中間數(shù)據(jù)后,就通過(guò)排序函數(shù)使具有相同key的中間value聚集在一起。MapReduce執(zhí)行流程(6)寫(xiě)入輸出文件:reduce節(jié)點(diǎn)將具有相同key的中間value值進(jìn)行迭加,并把結(jié)果傳遞給用戶(hù)自定義的reduce函數(shù)。reduce函數(shù)的結(jié)果寫(xiě)到最終的輸出文件。(7)返回調(diào)用點(diǎn):當(dāng)所有的map任務(wù)和reduce任務(wù)都執(zhí)行后,這時(shí)MapReduce就直接返回到用戶(hù)程序的調(diào)用點(diǎn)。5.4.3MapReduce數(shù)據(jù)流程在MapReduce執(zhí)行過(guò)程中數(shù)據(jù)流程主要分三個(gè)階段:(1)用戶(hù)將輸入文件拷貝到HDFS文件系統(tǒng)中。在該階段用戶(hù)需要將相關(guān)文件用命令拷貝到HDFS文件系統(tǒng)中,然后提交該任務(wù)。5.4.3MapReduce數(shù)據(jù)流程(2)Map階段輸入文件塊首先被劃分為多個(gè)數(shù)據(jù)分塊(Split),以便Map任務(wù)能并發(fā)的進(jìn)行之后每一個(gè)劃分將分配到Map函數(shù)為之運(yùn)行Combine階段:將中間結(jié)果中有相同key的<key,value>對(duì)集合并成一對(duì) Partition階段:該階段是把Map任務(wù)輸出的中間結(jié)果按key劃分成R份(R是預(yù)先定義的,數(shù)目等于Reduce任務(wù)的個(gè)數(shù))Map階段(3)Reduce階段這個(gè)階段可以分為3個(gè)步驟:排序(Sort)、混洗(Shuffle)和Reduce。Sort同Shuffle一塊進(jìn)行的,在這個(gè)階段中保證給定一個(gè)key它所有鍵值對(duì)是連續(xù)排列,并將來(lái)自不同Map輸出的中間結(jié)果具有相同key的<key,value>對(duì)集合并到一塊Reduce階段:用戶(hù)定義的Reduce函數(shù)執(zhí)行用戶(hù)所定義的操作,執(zhí)行后的最終結(jié)果通過(guò)OutputFormat輸出到HDFS中Reduce階段5.4.4MapReduce的容錯(cuò)機(jī)制(1)worker節(jié)點(diǎn)錯(cuò)誤master節(jié)點(diǎn)會(huì)周期性的向worker節(jié)點(diǎn)發(fā)送檢測(cè)命令。如果持續(xù)在一定的時(shí)間內(nèi)沒(méi)有從工作節(jié)點(diǎn)收到反饋,master節(jié)點(diǎn)就認(rèn)為該worker節(jié)點(diǎn)失效。MapReduce可以有效地允許一定范圍的worker節(jié)點(diǎn)失效的情況。MapReduce的master節(jié)點(diǎn)就會(huì)簡(jiǎn)單的把這些不能訪問(wèn)的worker節(jié)點(diǎn)上的工作再執(zhí)行一次MapReduce的容錯(cuò)機(jī)制(2)master節(jié)點(diǎn)失效分析master節(jié)點(diǎn)失效要區(qū)分兩種情況,一種是master程序失效,一種是運(yùn)行master程序的節(jié)點(diǎn)失效。Master會(huì)周期性地設(shè)置檢查點(diǎn)(checkpoint),并導(dǎo)出Master中的數(shù)據(jù)。一旦master程序失效,系統(tǒng)就從最近的一個(gè)檢查點(diǎn)恢復(fù)并重新執(zhí)行。另一種情況下,由于只有一個(gè)主控節(jié)點(diǎn),所以如果主控節(jié)點(diǎn)失效了,就只能終止整個(gè)MapReduce程序的執(zhí)行并重新開(kāi)始。5.4.5Hadoop新MapReduce框架YarnHadoop自0.23.0版本后新的map-reduce框架(Yarn)Yarn維持與以前版本(hadoop-0.20.205)的API兼容性。這意味著所有的MapReduce作業(yè)只需重新編譯就可以在新框架上運(yùn)行。Hadoop中的JobTracker進(jìn)程相當(dāng)于前面所說(shuō)的Master程序,TaskTracker進(jìn)程相當(dāng)于前面所說(shuō)的Worker程序。原框架的問(wèn)題隨著分布式系統(tǒng)集群的規(guī)模和其工作負(fù)荷的增長(zhǎng),原框架的問(wèn)題逐漸浮出水面,主要的問(wèn)題集中如下:1)JobTracker是Map-reduce的集中處理點(diǎn),存在單點(diǎn)故障。2)JobTracker完成了太多的任務(wù),造成了過(guò)多的資源消耗,當(dāng)map-reducejob非常多的時(shí)候,會(huì)造成很大的內(nèi)存開(kāi)銷(xiāo),潛在來(lái)說(shuō),也增加了JobTrackerfail的風(fēng)險(xiǎn),這也是業(yè)界普遍總結(jié)出老Hadoop的Map-Reduce只能支持4000節(jié)點(diǎn)主機(jī)的上限。原框架的問(wèn)題3)在TaskTracker端,以map/reducetask的數(shù)目作為資源的表示過(guò)于簡(jiǎn)單,沒(méi)有考慮到cpu/內(nèi)存的占用情況,如果兩個(gè)大內(nèi)存消耗的task被調(diào)度到了一塊,很容易出現(xiàn)OOM(OutOfMemory,內(nèi)存溢出)4)在TaskTracker端,把資源強(qiáng)制劃分為maptaskslot和reducetaskslot,如果當(dāng)系統(tǒng)中只有maptask或者只有reducetask的時(shí)候,會(huì)造成資源的浪費(fèi)slotslot不是CPU的Core,也不是memorychip,它是一個(gè)邏輯概念,一個(gè)節(jié)點(diǎn)的slot的數(shù)量用來(lái)表示某個(gè)節(jié)點(diǎn)的資源的容量或者說(shuō)是能力的大小,因而slot是Hadoop的資源單位。原框架的問(wèn)題5)源代碼層面分析的時(shí)候,會(huì)發(fā)現(xiàn)代碼非常的難讀,常常因?yàn)橐粋€(gè)class做了太多的事情,代碼量達(dá)3000多行,造成class的任務(wù)不清晰,增加bug修復(fù)和版本維護(hù)的難度。6)從操作的角度來(lái)看,現(xiàn)在的HadoopMapReduce框架在有任何重要的或者不重要的變化(例如bug修復(fù),性能提升和特性化)時(shí),都會(huì)強(qiáng)制進(jìn)行系統(tǒng)級(jí)別的升級(jí)更新。更糟的是,它不管用戶(hù)的喜好,強(qiáng)制讓分布式集群系統(tǒng)的每一個(gè)用戶(hù)端同時(shí)更新。這些更新會(huì)讓用戶(hù)為了驗(yàn)證他們之前的應(yīng)用程序是不是適用新的Hadoop版本而浪費(fèi)大量時(shí)間。YARN是一個(gè)資源管理平臺(tái)作為資源管理平臺(tái),YARN不僅能夠承載MapReduce(離線批處理計(jì)算框架)這一傳統(tǒng)計(jì)算框架,而且能承載Storm(實(shí)時(shí)計(jì)算框架)、Spark(內(nèi)存計(jì)算框架)、MPI(并行計(jì)算框架)。更重要的是,它還可以避免這些計(jì)算框架各自為戰(zhàn),實(shí)現(xiàn)各個(gè)計(jì)算框架之間的數(shù)據(jù)共享。YARN是一個(gè)資源管理平臺(tái)另外,使用YARN可以降低運(yùn)維管理成本并大大提高資源利用率。不同的計(jì)算框架,比如HadoopMapReduce、Spark、MPI等可以分別在不同的集群上運(yùn)行,即采用“一個(gè)框架一個(gè)集群”的模式,但需要多個(gè)管理員管理這些集群,增加了運(yùn)維成本。而“多個(gè)框架一個(gè)集群”的模式將只需要少數(shù)管理員就可完成統(tǒng)一管理,降低了運(yùn)維成本。而且不同的框架其運(yùn)行高峰所處的時(shí)間可能不同,若分散在不同的集群中,其資源利用率低,而集中在同一個(gè)共享的集群中,則可以提高資源利用率。圖中分散運(yùn)行的HadoopMapReduce、Spark、MPI框架其資源利用率最高時(shí)為33%,而集中到一個(gè)共享集群后,其資源利用率基本持續(xù)在100%。MapReduce1.0和MapReduce2.0區(qū)別:MapReduce1.0是一個(gè)獨(dú)立的系統(tǒng),直接運(yùn)行在Linux之上MapReduce2.0則是運(yùn)行在YARN上的框架,且可與多種框架一起運(yùn)行在YARN上MapReduce2.0和YARN區(qū)別:YARN是一個(gè)資源管理系統(tǒng),負(fù)責(zé)資源管理和調(diào)度MapReduce只是運(yùn)行在YARN上的一個(gè)應(yīng)用程序
如果把YARN看做“android”,則MapReduce只是一個(gè)“app”
但為什么人們又常常把MapReduce2.0和YARN相提并論呢,原因在于MapReduce從1.0到2.0升級(jí)時(shí),其2.0組件中包含了YARN,所以有人稱(chēng)YARN就是MapReduce2.0。Yarn架構(gòu)工作流程客戶(hù)端向資源管理器發(fā)送作業(yè)(Job)請(qǐng)求,資源管理器接收作業(yè)后為該作業(yè)分配一個(gè)容器以運(yùn)行該作業(yè),并啟動(dòng)一個(gè)AppMaster跟蹤應(yīng)用程序的狀態(tài),負(fù)責(zé)一個(gè)Job生命周期內(nèi)的所有工作。容器要向AppMaster匯報(bào)應(yīng)用程序的運(yùn)行狀態(tài)。若某個(gè)作業(yè)所需的資源較多,需要更多容器,則由AppMaster向資源管理器申請(qǐng)分配更多資源。NodeManager監(jiān)控應(yīng)用程序容器的資源使用情況(CPU,內(nèi)存,硬盤(pán),網(wǎng)絡(luò))并且向資源管理器匯報(bào)節(jié)點(diǎn)狀態(tài)。Yarn架構(gòu)原框架中核心的JobTracker和TaskTracker不見(jiàn)了,取而代之的是ResourceManager,ApplicationMaster與NodeManager三個(gè)部分ResourceManager是一個(gè)中心的服務(wù),它包括兩個(gè)組件:調(diào)度器(scheduler)和ApplicationsManager。調(diào)度器做的事情是調(diào)度。ResourceManager是基于應(yīng)用程序?qū)Y源的需求進(jìn)行調(diào)度的;每一個(gè)應(yīng)用程序需要不同類(lèi)型的資源因此就需要不同的容器。資源包括:內(nèi)存,CPU,磁盤(pán),網(wǎng)絡(luò)等等??梢钥闯?,這同現(xiàn)Mapreduce固定類(lèi)型的資源使用模型有顯著區(qū)別,它給集群的使用帶來(lái)負(fù)面的影響。資源管理器提供一個(gè)調(diào)度策略的插件,它負(fù)責(zé)將集群資源分配給多個(gè)隊(duì)列和應(yīng)用程序。調(diào)度插件可以基于現(xiàn)有的能力調(diào)度和公平調(diào)度模型。ApplicationsManager負(fù)責(zé)接收作業(yè)提交(job-submission),協(xié)商第一個(gè)容器用于啟動(dòng)每一個(gè)Job所屬的ApplicationMaster,另外監(jiān)控ApplicationMaster的存在情況,當(dāng)ApplicationMaster失效時(shí)負(fù)責(zé)提供服務(wù)重啟ApplicationMaster容器Yarn架構(gòu)NodeManager是每一臺(tái)機(jī)器框架的代理,是執(zhí)行應(yīng)用程序的容器,監(jiān)控應(yīng)用程序容器的資源使用情況
(CPU,內(nèi)存,硬盤(pán),網(wǎng)絡(luò))并且向調(diào)度器(scheduler)匯報(bào)。NodeManager功能比較專(zhuān)一,就是負(fù)責(zé)Container狀態(tài)的維護(hù),并向RM/scheduler保持心跳。每一個(gè)應(yīng)用的ApplicationMaster的職責(zé)有:向調(diào)度器索要適當(dāng)?shù)馁Y源容器,運(yùn)行任務(wù),跟蹤應(yīng)用程序的狀態(tài)和監(jiān)控它們的進(jìn)程,處理任務(wù)的失敗原因。ApplicationMaster負(fù)責(zé)一個(gè)Job生命周期內(nèi)的所有工作。但注意每一個(gè)Job(不是每一種)都有一個(gè)ApplicationMaster,它可以運(yùn)行在ResourceManager以外的機(jī)器上。Yarn框架相對(duì)于老的MapReduce框架什么優(yōu)勢(shì)1)這個(gè)設(shè)計(jì)大大減小了JobTracker(也就是現(xiàn)在的ResourceManager+ApplicationMaster)的資源消耗,并且讓監(jiān)測(cè)每一個(gè)Job子任務(wù)(tasks)狀態(tài)的程序分布式化了,更安全、更優(yōu)美。2)老的框架中,JobTracker一個(gè)很大的負(fù)擔(dān)就是監(jiān)控job下的tasks的運(yùn)行狀況,現(xiàn)在,這個(gè)部分就扔給ApplicationMaster做了,而ResourceManager中有一個(gè)模塊叫做ApplicationsManager,它是監(jiān)測(cè)ApplicationMaster的運(yùn)行狀況,如果出問(wèn)題,會(huì)將其在其他機(jī)器上重啟。Yarn框架相對(duì)于老的MapReduce框架什么優(yōu)勢(shì)3)在新的Yarn中,ApplicationMaster是一個(gè)可變更的部分,用戶(hù)可以對(duì)不同的編程模型寫(xiě)自己的AppMst,讓更多類(lèi)型的編程模型能夠跑在Hadoop集群中Yarn框架相對(duì)于老的MapReduce框架什么優(yōu)勢(shì)4)對(duì)于資源的表示以?xún)?nèi)存為單位(在目前版本的Yarn中,沒(méi)有考慮cpu的占用),比之前以剩余slot數(shù)目更合理。5)Container是Yarn為了將來(lái)作資源隔離而提出的一個(gè)框架。這一點(diǎn)應(yīng)該借鑒了Mesos的工作,目前是一個(gè)框架,僅僅提供java虛擬機(jī)內(nèi)存的隔離,hadoop團(tuán)隊(duì)的設(shè)計(jì)思路應(yīng)該后續(xù)能支持更多的資源調(diào)度和控制,既然資源表示成內(nèi)存量,那就沒(méi)有了之前的mapslot/reduceslot分開(kāi)造成集群資源閑置的尷尬情況在HDFS之上單獨(dú)搞多存儲(chǔ)介質(zhì)支持是不太友好的,最好跟Hadoop中資源管理系統(tǒng)YARN做一個(gè)結(jié)合,所以,有人預(yù)測(cè),HDFS和YARN的關(guān)系會(huì)逐步朝下圖展示的方式發(fā)展:HDFS和YARN的關(guān)系的預(yù)測(cè)支持長(zhǎng)服務(wù)YARN在2015年新增的一個(gè)重大特性是:支持長(zhǎng)服務(wù)YARN的最終定位是通用資源管理和調(diào)度系統(tǒng),包括支持像類(lèi)似MapReduce,Spark的短作業(yè)和類(lèi)似WebService,MySQL的長(zhǎng)服務(wù)。長(zhǎng)服務(wù)是指永不停止的應(yīng)用程序(除非異常退出或用戶(hù)主動(dòng)關(guān)閉),比如WebService、MySQL等,長(zhǎng)服務(wù)是相對(duì)短作業(yè)而言的,短作業(yè)是指分鐘,小時(shí)級(jí)別就會(huì)退出的應(yīng)用程序。5.5HBase5.5.1HBase概述5.5.2HBase與關(guān)系型數(shù)據(jù)庫(kù)的比較5.5.3HBase的數(shù)據(jù)模型5.5.4HBaseShell命令的應(yīng)用5.5.1HBase概述2006年底由PowerSet的ChadWalters和JimKellerman發(fā)起HBase,2008年HBase成為ApacheHadoop的一個(gè)子項(xiàng)目。HBase是一個(gè)分布式的、面向列的開(kāi)源數(shù)據(jù)庫(kù)。HBase是GoogleBigtable的開(kāi)源實(shí)現(xiàn)HBase最淺顯來(lái)看就是一張很大的表,表的屬性可以根據(jù)需求去動(dòng)態(tài)增加,但是又沒(méi)有表與表之間關(guān)聯(lián)查詢(xún)的需求。5.5.2HBase與關(guān)系型數(shù)據(jù)庫(kù)的比較HBase不同于一般的關(guān)系數(shù)據(jù)庫(kù),它是一個(gè)適合于結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)庫(kù)。另一個(gè)不同的是HBase基于列的而不是基于行的模式使用‘表’的概念,但不同于關(guān)系數(shù)據(jù)庫(kù),不支持SQL5.5.3HBase的數(shù)據(jù)模型HBase會(huì)存儲(chǔ)一系列的行記錄,行記錄有三個(gè)基本類(lèi)型:行鍵(RowKey):表的主鍵,表中的記錄按照RowKey排序。時(shí)間戳(TimeStamp):每次數(shù)據(jù)操作對(duì)應(yīng)的時(shí)間戳,可以看作是數(shù)據(jù)的版本號(hào)(versionnumber)。列簇(ColumnFamily):一個(gè)ColumnFamily中可以由任意多個(gè)Column組成,即ColumnFamily支持動(dòng)態(tài)擴(kuò)展,無(wú)需預(yù)先定義Column的數(shù)量以及類(lèi)型5.5.4HBaseShell命令的應(yīng)用HBase提供了一個(gè)shell的終端給用戶(hù)交互,提供各種表操作命令命令描述create創(chuàng)建表describe描述表enable表激活disable表取消drop刪除表get讀表put寫(xiě)表HBaseShell命令的應(yīng)用以一個(gè)學(xué)生成績(jī)表的例子來(lái)演示HBaseShell命令的用法namegradcoursematharthao5
9787liu48980
學(xué)生成績(jī)表的例子scores
HBaseShell命令的應(yīng)用(1)建立一個(gè)表格scores,具有兩個(gè)列族grad和course。hbase(main):001:0>create'scores','grade','course'0row(s)in0.4780seconds(2)查看當(dāng)前HBase中具有哪些表?hbase(main):002:0>listTABLEscores1row(s)in0.0270secondsHBaseShell命令的應(yīng)用(3)加入一行數(shù)據(jù),行名稱(chēng)為hao,列族名為“grad”,值為5。hbase(main):006:0>put'scores','hao','grad:','5'0row(s)in0.0420seconds(4)給hao這一行的數(shù)據(jù)的列族course添加一列<math,97>hbase(main):007:0>put'scores','hao','course:math','97'0row(s)in0.0270secondsHBaseShell命令的應(yīng)用(5)給hao這一行的數(shù)據(jù)的列族course添加一列<art,87>hbase(main):008:0>put'scores','hao','course:art','87'0row(s)in0.0260seconds(6)加入一行數(shù)據(jù),行名稱(chēng)為liu,列族名為“grad”,值為4。hbase(main):009:0>put'scores','liu','grad:','4'0row(s)in0.0260secondsHBaseShell命令的應(yīng)用(7)給liu這一行的數(shù)據(jù)的列族course添加一列<math,89>hbase(main):010:0>put'scores','liu','course:math','89'0row(s)in0.0270seconds(8)給liu這一行的數(shù)據(jù)的列族course添加一列<art,80>hbase(main):011:0>put'scores','liu','course:art','80'0row(s)in0.0270secondsHBaseShell命令的應(yīng)用(9)查看scores表中hao的相關(guān)數(shù)據(jù)hbase(main):012:0>get'scores','hao'COLUMNCELLcourse:arttimestamp=1316100110921,value=87course:mathtimestamp=1316100025944,value=97grade:timestamp=1316099975625,value=53row(s)in0.0480secondsHBaseShell命令的應(yīng)用(10)刪除scores表。hbase(main):024:0>disable'scores'0row(s)in0.0330secondshbase(main):025:0>drop'scores'0row(s)in1.0840seconds值得注意的是,用drop命令刪除表之前要先用disable命令禁用表5.6Zookeeper5.6.1Zookeeper的功能5.6.2Zookeeper的數(shù)據(jù)模型5.6.3Zookeeper的典型的應(yīng)用場(chǎng)景5.6.1Zookeeper的功能Zookeeper是Google的Chubby一個(gè)開(kāi)源的實(shí)現(xiàn),是高效和可靠的協(xié)同工作系統(tǒng)。提供的功能包括:統(tǒng)一命名服務(wù)(NameService)、配置管理(ConfigurationManagement)、集群管理(GroupMembership)、共享鎖(Locks)、隊(duì)列管理。它的作用主要是用來(lái)維護(hù)和監(jiān)控你存儲(chǔ)的數(shù)據(jù)的狀態(tài)變化。通過(guò)監(jiān)控這些數(shù)據(jù)狀態(tài)的變化,從而可以達(dá)到基于數(shù)據(jù)的集群管理5.6.2Zookeeper的數(shù)據(jù)模型Zookeeper維護(hù)一個(gè)具有層次關(guān)系的數(shù)據(jù)結(jié)構(gòu),它非常類(lèi)似于一個(gè)標(biāo)準(zhǔn)的文件系統(tǒng)Zookeeper數(shù)據(jù)結(jié)構(gòu)的特點(diǎn)1.每個(gè)子目錄項(xiàng)如NameService都被稱(chēng)作為znode,這個(gè)znode是被它所在的路徑唯一標(biāo)識(shí),如Server1這個(gè)znode的標(biāo)識(shí)為/NameService/Server1。2.znode可以有子節(jié)點(diǎn)目錄,并且每個(gè)znode可以存儲(chǔ)數(shù)據(jù),注意Ephemeral(臨時(shí)的)類(lèi)型的目錄節(jié)點(diǎn)不能有子節(jié)點(diǎn)目錄。3.znode是有版本的,每個(gè)znode中存儲(chǔ)的數(shù)據(jù)可以有多個(gè)版本,也就是一個(gè)訪問(wèn)路徑中可以存儲(chǔ)多份數(shù)據(jù)。
Zookeeper數(shù)據(jù)結(jié)構(gòu)的特點(diǎn)4.znode可以是臨時(shí)節(jié)點(diǎn)(Ephemeral節(jié)點(diǎn)),一旦創(chuàng)建這個(gè)znode的客戶(hù)端與服務(wù)器失去聯(lián)系,這個(gè)znode也將自動(dòng)刪除5.znode的目錄名可以自動(dòng)編號(hào)(Sequential節(jié)點(diǎn),有序的節(jié)點(diǎn)),如App1已經(jīng)存在,再創(chuàng)建的話(huà),將會(huì)自動(dòng)命名為App2。6.znode可以被監(jiān)控,包括這個(gè)目錄節(jié)點(diǎn)中存儲(chǔ)的數(shù)據(jù)的修改,子節(jié)點(diǎn)目錄的變化等,一旦變化可以通知設(shè)置監(jiān)控的客戶(hù)端,這個(gè)是Zookeeper的核心特性,Zookeeper的很多功能都是基于這個(gè)特性實(shí)現(xiàn)的5.6.3Zookeeper的典型應(yīng)用場(chǎng)景(1)統(tǒng)一命名服務(wù)(NameService)分布式應(yīng)用中,通常需要有一套完整的命名規(guī)則,既能夠產(chǎn)生唯一的名稱(chēng)又便于人識(shí)別和記住,通常情況下用樹(shù)形的名稱(chēng)結(jié)構(gòu)是一個(gè)理想的選擇,樹(shù)形的名稱(chēng)結(jié)構(gòu)是一個(gè)有層次的目錄結(jié)構(gòu),既對(duì)人友好又不會(huì)重復(fù)Zookeeper需要一個(gè)不會(huì)重復(fù)的名稱(chēng),就像數(shù)據(jù)庫(kù)中產(chǎn)生一個(gè)唯一的數(shù)字主鍵一樣。(2)配置管理(ConfigurationManagement)配置的管理在分布式應(yīng)用環(huán)境中很常見(jiàn),例如同一個(gè)應(yīng)用系統(tǒng)需要多臺(tái)PCServer運(yùn)行,但是它們運(yùn)行的應(yīng)用系統(tǒng)的某些配置項(xiàng)是相同的,如果要修改這些相同的配置項(xiàng),那么就必須同時(shí)修改每臺(tái)運(yùn)行這個(gè)應(yīng)用系統(tǒng)的PCServer,這樣非常麻煩而且容易出錯(cuò)。像這樣的配置信息完全可以交給Zookeeper來(lái)管理,將配置信息保存在Zookeeper的某個(gè)目錄節(jié)點(diǎn)中,然后將所有需要修改的應(yīng)用機(jī)器監(jiān)控配置信息的狀態(tài),一旦配置信息發(fā)生變化,每臺(tái)應(yīng)用機(jī)器就會(huì)收到Zookeeper的通知,然后從Zookeeper獲取新的配置信息應(yīng)用到系統(tǒng)中配置管理結(jié)構(gòu)圖(3)集群管理(GroupMembership)Zookeeper能夠很容易的實(shí)現(xiàn)集群管理的功能,如有多臺(tái)Server組成一個(gè)服務(wù)集群,那么必須要一個(gè)“總管”知道當(dāng)前集群中每臺(tái)機(jī)器的服務(wù)狀態(tài),一旦有機(jī)器不能提供服務(wù),集群中其它集群必須知道,從而做出調(diào)整重新分配服務(wù)策略。同樣當(dāng)增加集群的服務(wù)能力時(shí),就會(huì)增加一臺(tái)或多臺(tái)Server,同樣也必須讓“總管”知道。(3)集群管理(GroupMembership)它的實(shí)現(xiàn)方式都是在Zookeeper上創(chuàng)建一個(gè)Ephemeral類(lèi)型的目錄節(jié)點(diǎn),然后每個(gè)Server在它們創(chuàng)建目錄節(jié)點(diǎn)的父目錄節(jié)點(diǎn)上調(diào)用getChildren(Stringpath,booleanwatch)方法并設(shè)置watch為true,由于是Ephemeral目錄節(jié)點(diǎn),當(dāng)創(chuàng)建它的Server死去,這個(gè)目錄節(jié)點(diǎn)也隨之被刪除,所以Children將會(huì)變化,這時(shí)getChildren上的Watch將會(huì)被調(diào)用,所以其它Server就知道已經(jīng)有某臺(tái)Server死去了。新增Server也是同樣的原理。(4)共享鎖(Locks)共享鎖在同一個(gè)進(jìn)程中很容易實(shí)現(xiàn),但是在跨進(jìn)程或者在不同Server之間就不好實(shí)現(xiàn)了。Zookeeper卻很容易實(shí)現(xiàn)這個(gè)功能,實(shí)現(xiàn)方式也是需要獲得鎖的Server創(chuàng)建一個(gè)Ephemeral_Sequential目錄節(jié)點(diǎn),然后調(diào)用getChildren方法獲取當(dāng)前的目錄節(jié)點(diǎn)列表中最小的目錄節(jié)點(diǎn)是不是就是自己創(chuàng)建的目錄節(jié)點(diǎn),如果正是自己創(chuàng)建的,那么它就獲得了這個(gè)鎖,如果不是那么它就調(diào)用exists(Stringpath,booleanwatch)方法并監(jiān)控Zookeeper上目錄節(jié)點(diǎn)列表的變化,一直到自己創(chuàng)建的節(jié)點(diǎn)是列表中最小編號(hào)的目錄節(jié)點(diǎn),從而獲得鎖。釋放鎖很簡(jiǎn)單,只要?jiǎng)h除前面它自己所創(chuàng)建的目錄節(jié)點(diǎn)就行了。(5)隊(duì)列管理Zookeeper可以處理兩種類(lèi)型的隊(duì)列:當(dāng)一個(gè)隊(duì)列的成員都聚齊時(shí),這個(gè)隊(duì)列才可用,否則一直等待所有成員到達(dá),這種是同步隊(duì)列。隊(duì)列按照FIFO方式進(jìn)行入隊(duì)和出隊(duì)操作,例如實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者模型。5.7Hadoop的程序?qū)嵗\(yùn)行與分析5.7.1WordCount實(shí)例5.7.2每年最高氣溫實(shí)例5.7.3基于Hadoop的數(shù)據(jù)挖掘開(kāi)源平臺(tái)-Mahout5.7.1WordCount實(shí)例MapReduce對(duì)數(shù)據(jù)的處理是通過(guò)map()和reduce()兩個(gè)自定義函數(shù)實(shí)現(xiàn)的,在詞頻統(tǒng)計(jì)中這兩個(gè)函數(shù)具體如下:Map(K,V){
ForeachwordwinV
Collect(w,1);
}
Reduce(K,V[]){
intcount=0;
ForeachvinV
count+=v;
Collect(K,count);
}詞頻統(tǒng)計(jì)Step1:首先對(duì)輸入的文檔文件進(jìn)行分割(Split),把輸入文件分成兩組,且由系統(tǒng)自動(dòng)完成HelloHadoopByeHadoopHelloWorldGoodByeWorldsplitsplitHelloHadoopByeHadoopHelloWorldGoodByeWorld詞頻統(tǒng)計(jì)Step2:在輸入文件分割完成之后,使用用戶(hù)編寫(xiě)好的Map函數(shù)從而產(chǎn)生<key,value>集HelloHadoopByeHadoopHelloWorldGoodByeWorldmapmap<Hello,1><Hadoop,1><Bye,1><Hadoop,1><Hello,1><World,1><GoodBye,1><World,1>詞頻統(tǒng)計(jì)Step3:combine和partition過(guò)程<Hello,1><Hadoop,1><Bye,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二四年度智能化煤場(chǎng)租賃經(jīng)營(yíng)合同3篇
- 職業(yè)技術(shù)學(xué)院教學(xué)診斷與改進(jìn)學(xué)習(xí)手冊(cè)
- 產(chǎn)褥期母嬰的護(hù)理主講人趙國(guó)璽
- 二零二五年度土地承包經(jīng)營(yíng)權(quán)抵押合同范本編制
- 2025年度農(nóng)家院農(nóng)產(chǎn)品銷(xiāo)售合作租賃合同范本4篇
- 課題申報(bào)參考:明清近代文人圈層化及思想傾向、審美感知研究
- 2025年度個(gè)人與公司租賃保證金合同3篇
- 二零二五年度工器具庫(kù)存管理及采購(gòu)合同3篇
- 二零二五年度高端住宅內(nèi)墻涂料個(gè)性化定制合同4篇
- 江蘇省啟東市匯龍中學(xué)2013屆高三高考考前輔導(dǎo)語(yǔ)文試題(含答案)
- 發(fā)電機(jī)停電故障應(yīng)急預(yù)案
- 接電的施工方案
- 常用藥物作用及副作用課件
- 幼兒阿拉伯?dāng)?shù)字描紅(0-100)打印版
- 社會(huì)組織等級(jí)評(píng)估報(bào)告模板
- GB/T 12173-2008礦用一般型電氣設(shè)備
- 2023年1月浙江高考英語(yǔ)聽(tīng)力試題及答案(含MP3+錄音原文)
- 【課件】第三課 蒙娜麗莎 課件高中美術(shù)湘美版美術(shù)鑒賞
- 新媒體研究方法教學(xué)ppt課件(完整版)
- 東芝空調(diào)維修故障代碼匯總
- 工藝管道儀表流程圖(共68頁(yè)).ppt
評(píng)論
0/150
提交評(píng)論