分布式計(jì)算開(kāi)源框架Hadoop介紹
作者 岑文初 發(fā)布于 2008年8月4日 上午2時(shí)15分
社區(qū)
Java
主題
網(wǎng)格計(jì)算,
集群與緩存
標(biāo)簽
Hadoop
──
分布式計(jì)算開(kāi)源框架Hadoop入門(mén)實(shí)踐(一)
相關(guān)廠(chǎng)商內(nèi)容
迷你書(shū)免費(fèi)下載:開(kāi)源選型、Struts
2、Scrum和XP、GRails
SOY
Framework:Java富客戶(hù)端快速開(kāi)發(fā)框架
在SIP項(xiàng)目設(shè)計(jì)的過(guò)程中,對(duì)于它龐大的日志在開(kāi)始時(shí)就考慮使用任務(wù)分解的多線(xiàn)程處理模式來(lái)分析統(tǒng)計(jì),在我從前寫(xiě)的文章《Tiger
Concurrent Practice
--日志分析并行分解設(shè)計(jì)與實(shí)現(xiàn)》中有所提到。但是由于統(tǒng)計(jì)的內(nèi)容暫時(shí)還是十分簡(jiǎn)單,所以就采用Memcache作為計(jì)數(shù)器,結(jié)合MySQL就完成了訪(fǎng)問(wèn)
控制以及統(tǒng)計(jì)的工作。然而未來(lái),對(duì)于海量日志分析的工作,還是需要有所準(zhǔn)備。現(xiàn)在最火的技術(shù)詞匯莫過(guò)于“云計(jì)算”,在Open
API日益盛行的今天,互聯(lián)網(wǎng)應(yīng)用的數(shù)據(jù)將會(huì)越來(lái)越有價(jià)值,如何去分析這些數(shù)據(jù),挖掘其內(nèi)在價(jià)值,就需要分布式計(jì)算來(lái)支撐海量數(shù)據(jù)的分析工作。
回過(guò)頭來(lái)看,早先那種多線(xiàn)程,多任務(wù)分解的日志分析設(shè)計(jì),其實(shí)是分布式計(jì)算的一個(gè)單機(jī)版縮略,如何將這種單機(jī)的工作進(jìn)行分拆,變成協(xié)同工作的集群,
其實(shí)就是分布式計(jì)算框架設(shè)計(jì)所涉及的。在去年參加BEA大會(huì)的時(shí)候,BEA和VMWare合作采用虛擬機(jī)來(lái)構(gòu)建集群,無(wú)非就是希望使得計(jì)算機(jī)硬件能夠類(lèi)似
于應(yīng)用程序中資源池的資源,使用者無(wú)需關(guān)心資源的分配情況,從而最大化了硬件資源的使用價(jià)值。分布式計(jì)算也是如此,具體的計(jì)算任務(wù)交由哪一臺(tái)機(jī)器執(zhí)行,執(zhí)
行后由誰(shuí)來(lái)匯總,這都由分布式框架的Master來(lái)抉擇,而使用者只需簡(jiǎn)單地將待分析內(nèi)容提供給分布式計(jì)算系統(tǒng)作為輸入,就可以得到分布式計(jì)算后的結(jié)果。
Hadoop是Apache開(kāi)源組織的一個(gè)分布式計(jì)算開(kāi)源框架,在很多大型網(wǎng)站上都已經(jīng)得到了應(yīng)用,如亞馬遜、Facebook和Yahoo等等。
對(duì)于我來(lái)說(shuō),最近的一個(gè)使用點(diǎn)就是服務(wù)集成平臺(tái)的日志分析。服務(wù)集成平臺(tái)的日志量將會(huì)很大,而這也正好符合了分布式計(jì)算的適用場(chǎng)景(日志分析和索引建立就
是兩大應(yīng)用場(chǎng)景)。
當(dāng)前沒(méi)有正式確定使用,所以也是自己業(yè)余摸索,后續(xù)所寫(xiě)的相關(guān)內(nèi)容,都是一個(gè)新手的學(xué)習(xí)過(guò)程,難免會(huì)有一些錯(cuò)誤,只是希望記錄下來(lái)可以分享給更多志同道合的朋友。
什么是Hadoop?
搞什么東西之前,第一步是要知道What(是什么),然后是Why(為什么),最后才是How(怎么做)。但很多開(kāi)發(fā)的朋友在做了多年項(xiàng)目以后,都習(xí)慣是先How,然后What,最后才是Why,這樣只會(huì)讓自己變得浮躁,同時(shí)往往會(huì)將技術(shù)誤用于不適合的場(chǎng)景。
Hadoop框架中最核心的設(shè)計(jì)就是:MapReduce和HDFS。MapReduce的思想是由Google的一篇論文所提及而被廣為流傳的,
簡(jiǎn)單的一句話(huà)解釋MapReduce就是“任務(wù)的分解與結(jié)果的匯總”。HDFS是Hadoop分布式文件系統(tǒng)(Hadoop Distributed File
System)的縮寫(xiě),為分布式計(jì)算存儲(chǔ)提供了底層支持。
MapReduce從它名字上來(lái)看就大致可以看出個(gè)緣由,兩個(gè)動(dòng)詞Map和Reduce,“Map(展開(kāi))”就是將一個(gè)任務(wù)分解成為多個(gè)任務(wù),
“Reduce”就是將分解后多任務(wù)處理的結(jié)果匯總起來(lái),得出最后的分析結(jié)果。這不是什么新思想,其實(shí)在前面提到的多線(xiàn)程,多任務(wù)的設(shè)計(jì)就可以找到這種思
想的影子。不論是現(xiàn)實(shí)社會(huì),還是在程序設(shè)計(jì)中,一項(xiàng)工作往往可以被拆分成為多個(gè)任務(wù),任務(wù)之間的關(guān)系可以分為兩種:一種是不相關(guān)的任務(wù),可以并行執(zhí)行;另
一種是任務(wù)之間有相互的依賴(lài),先后順序不能夠顛倒,這類(lèi)任務(wù)是無(wú)法并行處理的。回到大學(xué)時(shí)期,教授上課時(shí)讓大家去分析關(guān)鍵路徑,無(wú)非就是找最省時(shí)的任務(wù)分
解執(zhí)行方式。在分布式系統(tǒng)中,機(jī)器集群就可以看作硬件資源池,將并行的任務(wù)拆分,然后交由每一個(gè)空閑機(jī)器資源去處理,能夠極大地提高計(jì)算效率,同時(shí)這種資
源無(wú)關(guān)性,對(duì)于計(jì)算集群的擴(kuò)展無(wú)疑提供了最好的設(shè)計(jì)保證。(其實(shí)我一直認(rèn)為Hadoop的卡通圖標(biāo)不應(yīng)該是一個(gè)小象,應(yīng)該是螞蟻,分布式計(jì)算就好比螞蟻吃
大象,廉價(jià)的機(jī)器群可以匹敵任何高性能的計(jì)算機(jī),縱向擴(kuò)展的曲線(xiàn)始終敵不過(guò)橫向擴(kuò)展的斜線(xiàn))。任務(wù)分解處理以后,那就需要將處理以后的結(jié)果再匯總起來(lái),這 就是Reduce要做的工作。

圖1:MapReduce結(jié)構(gòu)示意圖
上圖就是MapReduce大致的結(jié)構(gòu)圖,在Map前還可能會(huì)對(duì)輸入的數(shù)據(jù)有Split(分割)的過(guò)程,保證任務(wù)并行效率,在Map之后還會(huì)有Shuffle(混合)的過(guò)程,對(duì)于提高Reduce的效率以及減小數(shù)據(jù)傳輸?shù)膲毫τ泻艽蟮膸椭:竺鏁?huì)具體提及這些部分的細(xì)節(jié)。
HDFS是分布式計(jì)算的存儲(chǔ)基石,Hadoop的分布式文件系統(tǒng)和其他分布式文件系統(tǒng)有很多類(lèi)似的特質(zhì)。分布式文件系統(tǒng)基本的幾個(gè)特點(diǎn):
- 對(duì)于整個(gè)集群有單一的命名空間。
- 數(shù)據(jù)一致性。適合一次寫(xiě)入多次讀取的模型,客戶(hù)端在文件沒(méi)有被成功創(chuàng)建之前無(wú)法看到文件存在。
- 文件會(huì)被分割成多個(gè)文件塊,每個(gè)文件塊被分配存儲(chǔ)到數(shù)據(jù)節(jié)點(diǎn)上,而且根據(jù)配置會(huì)由復(fù)制文件塊來(lái)保證數(shù)據(jù)的安全性。

圖2:HDFS結(jié)構(gòu)示意圖
上圖中展現(xiàn)了整個(gè)HDFS三個(gè)重要角色:NameNode、DataNode和Client。NameNode可以看作是分布式文件系統(tǒng)中的管理
者,主要負(fù)責(zé)管理文件系統(tǒng)的命名空間、集群配置信息和存儲(chǔ)塊的復(fù)制等。NameNode會(huì)將文件系統(tǒng)的Meta-data存儲(chǔ)在內(nèi)存中,這些信息主要包括
了文件信息、每一個(gè)文件對(duì)應(yīng)的文件塊的信息和每一個(gè)文件塊在DataNode的信息等。DataNode是文件存儲(chǔ)的基本單元,它將Block存儲(chǔ)在本地
文件系統(tǒng)中,保存了Block的Meta-data,同時(shí)周期性地將所有存在的Block信息發(fā)送給NameNode。Client就是需要獲取分布式文
件系統(tǒng)文件的應(yīng)用程序。這里通過(guò)三個(gè)操作來(lái)說(shuō)明他們之間的交互關(guān)系。
文件寫(xiě)入:
- Client向NameNode發(fā)起文件寫(xiě)入的請(qǐng)求。
- NameNode根據(jù)文件大小和文件塊配置情況,返回給Client它所管理部分DataNode的信息。
- Client將文件劃分為多個(gè)Block,根據(jù)DataNode的地址信息,按順序?qū)懭氲矫恳粋€(gè)DataNode塊中。
文件讀取:
- Client向NameNode發(fā)起文件讀取的請(qǐng)求。
- NameNode返回文件存儲(chǔ)的DataNode的信息。
- Client讀取文件信息。
文件Block復(fù)制:
- NameNode發(fā)現(xiàn)部分文件的Block不符合最小復(fù)制數(shù)或者部分DataNode失效。
- 通知DataNode相互復(fù)制Block。
- DataNode開(kāi)始直接相互復(fù)制。
最后再說(shuō)一下HDFS的幾個(gè)設(shè)計(jì)特點(diǎn)(對(duì)于框架設(shè)計(jì)值得借鑒):
- Block的放置:默認(rèn)不配置。一個(gè)Block會(huì)有三份備份,一份放在NameNode指定的DataNode,另一份放在
與指定DataNode非同一Rack上的DataNode,最后一份放在與指定DataNode同一Rack上的DataNode上。備份無(wú)非就是為了
數(shù)據(jù)安全,考慮同一Rack的失敗情況以及不同Rack之間數(shù)據(jù)拷貝性能問(wèn)題就采用這種配置方式。
- 心跳檢測(cè)DataNode的健康狀況,如果發(fā)現(xiàn)問(wèn)題就采取數(shù)據(jù)備份的方式來(lái)保證數(shù)據(jù)的安全性。
- 數(shù)
據(jù)復(fù)制(場(chǎng)景為DataNode失敗、需要平衡DataNode的存儲(chǔ)利用率和需要平衡DataNode數(shù)據(jù)交互壓力等情況):這里先說(shuō)一下,使用
HDFS的balancer命令,可以配置一個(gè)Threshold來(lái)平衡每一個(gè)DataNode磁盤(pán)利用率。例如設(shè)置了Threshold為10%,那么
執(zhí)行balancer命令的時(shí)候,首先統(tǒng)計(jì)所有DataNode的磁盤(pán)利用率的均值,然后判斷如果某一個(gè)DataNode的磁盤(pán)利用率超過(guò)這個(gè)均值
Threshold以上,那么將會(huì)把這個(gè)DataNode的block轉(zhuǎn)移到磁盤(pán)利用率低的DataNode,這對(duì)于新節(jié)點(diǎn)的加入來(lái)說(shuō)十分有用。
- 數(shù)據(jù)交驗(yàn):采用CRC32作數(shù)據(jù)交驗(yàn)。在文件Block寫(xiě)入的時(shí)候除了寫(xiě)入數(shù)據(jù)還會(huì)寫(xiě)入交驗(yàn)信息,在讀取的時(shí)候需要交驗(yàn)后再讀入。
- NameNode是單點(diǎn):如果失敗的話(huà),任務(wù)處理信息將會(huì)紀(jì)錄在本地文件系統(tǒng)和遠(yuǎn)端的文件系統(tǒng)中。
- 數(shù)
據(jù)管道性的寫(xiě)入:當(dāng)客戶(hù)端要寫(xiě)入文件到DataNode上,首先客戶(hù)端讀取一個(gè)Block然后寫(xiě)到第一個(gè)DataNode上,然后由第一個(gè)
DataNode傳遞到備份的DataNode上,一直到所有需要寫(xiě)入這個(gè)Block的NataNode都成功寫(xiě)入,客戶(hù)端才會(huì)繼續(xù)開(kāi)始寫(xiě)下一個(gè)
Block。
- 安全模式:在分布式文件系統(tǒng)啟動(dòng)的時(shí)候,開(kāi)始的時(shí)候會(huì)有安全模式,當(dāng)分布式文件系統(tǒng)處于安全模式的情況下,文
件系統(tǒng)中的內(nèi)容不允許修改也不允許刪除,直到安全模式結(jié)束。安全模式主要是為了系統(tǒng)啟動(dòng)的時(shí)候檢查各個(gè)DataNode上數(shù)據(jù)塊的有效性,同時(shí)根據(jù)策略必
要的復(fù)制或者刪除部分?jǐn)?shù)據(jù)塊。運(yùn)行期通過(guò)命令也可以進(jìn)入安全模式。在實(shí)踐過(guò)程中,系統(tǒng)啟動(dòng)的時(shí)候去修改和刪除文件也會(huì)有安全模式不允許修改的出錯(cuò)提示,只
需要等待一會(huì)兒即可。
下面綜合MapReduce和HDFS來(lái)看Hadoop的結(jié)構(gòu):

圖3:Hadoop結(jié)構(gòu)示意圖
在Hadoop的系統(tǒng)中,會(huì)有一臺(tái)Master,主要負(fù)責(zé)NameNode的工作以及JobTracker的工作。JobTracker的主要職責(zé)
就是啟動(dòng)、跟蹤和調(diào)度各個(gè)Slave的任務(wù)執(zhí)行。還會(huì)有多臺(tái)Slave,每一臺(tái)Slave通常具有DataNode的功能并負(fù)責(zé)TaskTracker的
工作。TaskTracker根據(jù)應(yīng)用要求來(lái)結(jié)合本地?cái)?shù)據(jù)執(zhí)行Map任務(wù)以及Reduce任務(wù)。
說(shuō)到這里,就要提到分布式計(jì)算最重要的一個(gè)設(shè)計(jì)點(diǎn):Moving
Computation is Cheaper than Moving
Data。就是在分布式處理中,移動(dòng)數(shù)據(jù)的代價(jià)總是高于轉(zhuǎn)移計(jì)算的代價(jià)。簡(jiǎn)單來(lái)說(shuō)就是分而治之的工作,需要將數(shù)據(jù)也分而存儲(chǔ),本地任務(wù)處理本地?cái)?shù)據(jù)然后歸
總,這樣才會(huì)保證分布式計(jì)算的高效性。
為什么要選擇Hadoop?
說(shuō)完了What,簡(jiǎn)單地說(shuō)一下Why。官方網(wǎng)站已經(jīng)給了很多的說(shuō)明,這里就大致說(shuō)一下其優(yōu)點(diǎn)及使用的場(chǎng)景(沒(méi)有不好的工具,只用不適用的工具,因此選擇好場(chǎng)景才能夠真正發(fā)揮分布式計(jì)算的作用):
- 可擴(kuò)展:不論是存儲(chǔ)的可擴(kuò)展還是計(jì)算的可擴(kuò)展都是Hadoop的設(shè)計(jì)根本。
- 經(jīng)濟(jì):框架可以運(yùn)行在任何普通的PC上。
- 可靠:分布式文件系統(tǒng)的備份恢復(fù)機(jī)制以及MapReduce的任務(wù)監(jiān)控保證了分布式處理的可靠性。
- 高效:分布式文件系統(tǒng)的高效數(shù)據(jù)交互實(shí)現(xiàn)以及MapReduce結(jié)合Local
Data處理的模式,為高效處理海量的信息作了基礎(chǔ)準(zhǔn)備。
使用場(chǎng)景:個(gè)人覺(jué)得最適合的就是海量數(shù)據(jù)的分析,其實(shí)Google最早提出MapReduce也就是為了海量數(shù)
據(jù)分析。同時(shí)HDFS最早是為了搜索引擎實(shí)現(xiàn)而開(kāi)發(fā)的,后來(lái)才被用于分布式計(jì)算框架中。海量數(shù)據(jù)被分割于多個(gè)節(jié)點(diǎn),然后由每一個(gè)節(jié)點(diǎn)并行計(jì)算,將得出的結(jié)
果歸并到輸出。同時(shí)第一階段的輸出又可以作為下一階段計(jì)算的輸入,因此可以想象到一個(gè)樹(shù)狀結(jié)構(gòu)的分布式計(jì)算圖,在不同階段都有不同產(chǎn)出,同時(shí)并行和串行結(jié)
合的計(jì)算也可以很好地在分布式集群的資源下得以高效的處理。