文|唐京偉
自從亞馬孫推出Amazon Web Service (AWS)的IaaS服務(wù)以來,現(xiàn)在其Amazon EC2、Amazon AWS、Amazon S3、Amazon SQS等云計算平臺已經(jīng)被上千家公司使用。Google公司在2008年提供了基于PaaS的Google App Engine。在Google的基礎(chǔ)架構(gòu)上運(yùn)行網(wǎng)絡(luò)應(yīng)用程序,能讓開發(fā)人員在支持著自己的應(yīng)用程序的可擴(kuò)展系統(tǒng)上構(gòu)建網(wǎng)絡(luò)應(yīng)用程序。隨后,微軟公司也推出了Windows Azure操作系統(tǒng),這個系統(tǒng)作為微軟云計算計劃的服務(wù)器端操作系統(tǒng)(Cloud OS)為廣大開發(fā)者提供服務(wù)。IBM在2007年提出了“藍(lán)云”計劃,推出共有云和私有云的概念。IBM提出私有云解決方案是為了減少諸如數(shù)據(jù)、信息安全等共有云現(xiàn)存的問題,從而搶占企業(yè)云計算市場。
在我國云計算產(chǎn)業(yè)的發(fā)展也得到了政府的高度重視,在2010年10月召開的十七屆五中全會的報告中,重點(diǎn)提到發(fā)展新一代信息技術(shù),而云計算和三網(wǎng)融合、物聯(lián)網(wǎng)等一起被作為最重要的方向之一。從2008年開始,已經(jīng)有多個地方政府在積極推進(jìn)云計算產(chǎn)業(yè)和應(yīng)用的發(fā)展,例如:無錫中國云計算中心、上海的“云海計劃”、北京的“祥云計劃”,等等,此外,成都、佛山、東莞、鄂爾多斯等城市也在紛紛跟進(jìn)??梢灶A(yù)見,未來云計算將成為十二五期間,信息技術(shù)領(lǐng)域最重要的發(fā)展方向,無論是技術(shù)研發(fā)、產(chǎn)品推廣還是應(yīng)用示范等方面,都將獲得政府在政策、資金、項(xiàng)目等方面的大力支持。
云計算是網(wǎng)格計算(Grid Computing)、分布式計算(Distributed Computing)、并行計算(Parallel Computing)、效用計算(Utility Computing)、網(wǎng)絡(luò)存儲(Network Storage Technologies)、虛擬化(Virtualization)、負(fù)載均衡(Load Balance)等傳統(tǒng)計算機(jī)和網(wǎng)絡(luò)技術(shù)發(fā)展融合的產(chǎn)物。廣義云計算指服務(wù)的交付和使用模式,指通過網(wǎng)絡(luò)以按需要、易擴(kuò)展的方式獲得服務(wù)。這種服務(wù)可以是IT軟件和互聯(lián)網(wǎng)相關(guān)服務(wù),也可以是其他服務(wù)。狹義云計算指IT基礎(chǔ)設(shè)施的交付和使用模式,指通過網(wǎng)絡(luò)以按需、易擴(kuò)展的方式獲得所需資源。總體來說云計算具有以下幾個特點(diǎn):
(1)超大規(guī)模:“云”具有相當(dāng)?shù)囊?guī)模,Google云計算已經(jīng)擁有100多萬臺服務(wù)器, Amazon、IBM、微軟、Yahoo等的“云”均擁有幾十萬臺服務(wù)器。企業(yè)私有云一般擁有數(shù)百上千臺服務(wù)器?!霸啤蹦苜x予用戶前所未有的計算能力。
(2)虛擬化:云計算支持用戶在任意位置、使用各種終端獲取應(yīng)用服務(wù)。所請求的資源來自“云”,而不是固定的有形的實(shí)體。應(yīng)用在“云”中某處運(yùn)行,但實(shí)際上用戶無需了解、也不用擔(dān)心應(yīng)用運(yùn)行的具體位置。只需要一臺筆記本或者一個手機(jī),就可以通過網(wǎng)絡(luò)服務(wù)來實(shí)現(xiàn)我們需要的一切,甚至包括超級計算這樣的任務(wù)。
(3)高可靠性:“云”使用了數(shù)據(jù)多副本容錯、計算節(jié)點(diǎn)同構(gòu)可互換等措施來保障服務(wù)的高可靠性,使用云計算比使用本地計算機(jī)可靠。
(4)通用性:云計算不針對特定的應(yīng)用,在“云”的支撐下可以構(gòu)造出千變?nèi)f化的應(yīng)用,同一個“云”可以同時支撐不同的應(yīng)用運(yùn)行。
(5)高可擴(kuò)展性:“云”的規(guī)??梢詣討B(tài)伸縮,滿足應(yīng)用和用戶規(guī)模增長的需要。
(6)按需服務(wù):“云”是一個龐大的資源池,你按需購買;云可以像自來水,電,煤氣那樣計費(fèi)。
(7)廉價性:由于“云”的特殊容錯措施可以采用極其廉價的節(jié)點(diǎn)來構(gòu)成云,“云”的自動化集中式管理使大量企業(yè)無需負(fù)擔(dān)日益高昂的數(shù)據(jù)中心管理成本,“云”的通用性使資源的利用率較之傳統(tǒng)系統(tǒng)大幅提升,因此用戶可以充分享受“云”的低成本優(yōu)勢。
云計算是當(dāng)今IT行業(yè)的熱門話題。但事實(shí)上,云計算的原型是由太陽公司在1983年提出的“網(wǎng)絡(luò)即電腦”(The Network is the Computer);2002年,亞馬孫推出Amazon Web Service,是第一個云計算服務(wù)平臺,2006年8月9日,Google首席執(zhí)行官埃里克·施密特在搜索引擎大會(SES San Jose 2006)上首次提出云計算(Cloud Computing)這個概念。從此,云計算便成了IT業(yè)的焦點(diǎn)。
云存儲是在云計算(cloud computing)概念上延伸和發(fā)展出來的一個新的概念,是指通過集群應(yīng)用、網(wǎng)格技術(shù)或分布式文件系統(tǒng)等功能,將網(wǎng)絡(luò)中大量各種不同類型的存儲設(shè)備通過應(yīng)用軟件集合起來協(xié)同工作,共同對外提供數(shù)據(jù)存儲和業(yè)務(wù)訪問功能的一個系統(tǒng)。 當(dāng)云計算系統(tǒng)運(yùn)算和處理的核心是大量數(shù)據(jù)的存儲和管理時,云計算系統(tǒng)中就需要配置大量的存儲設(shè)備,那么云計算系統(tǒng)就轉(zhuǎn)變成為一個云存儲系統(tǒng),所以云存儲是一個以數(shù)據(jù)存儲和管理為核心的云計算系統(tǒng)。簡單來說,云存儲就是將儲存資源放到網(wǎng)絡(luò)上供人存取的一種新興方案。使用者可以在任何時間、任何地方,透過任何可連網(wǎng)的裝置方便地存取數(shù)據(jù)。同時,在云數(shù)據(jù)中心所使用的存儲必須具有良好的兼容性。在云計算時代,計算資源都被收歸到數(shù)據(jù)中心之中,再連同配套的存儲空間一起分發(fā)給用戶,由于眾多的用戶帶來了各種各樣的需求,Windows、Linux、Unix、Mac OS,存儲需要面對各種不同的操作系統(tǒng),如果給每種操作系統(tǒng)都配備專門的存儲的話,無疑與云計算的精神背道而馳,因此,云計算環(huán)境中,首先要解決的就是兼容性問題。其次是存儲容量的擴(kuò)展能力。
Hadoop軟件平臺
Hadoop是根據(jù)Google公司公開的資料開發(fā)出來的類似于Google File System的Hadoop File System 以及相應(yīng)的Map/Reduce編程規(guī)范。Hadoop是開放源代碼,開發(fā)人員可以使用它來開發(fā)云計算應(yīng)用,尤其是云硬件平臺。
Hadoop實(shí)現(xiàn)了一個分布式文件系統(tǒng)(Hadoop Distributed File System),簡稱HDFS。HDFS有著高容錯性的特點(diǎn),并且用來設(shè)計部署在低廉的硬件上。它提供高吞吐量來訪問數(shù)據(jù),適合那些有著大量數(shù)據(jù)的應(yīng)用程序。HDFS可以以流的形式訪問文件系統(tǒng)中的數(shù)據(jù)。
Hadoop還實(shí)現(xiàn)了MapReduce分布式計算模型。MapReduce將應(yīng)用程序的工作分解成很多小的工作塊。HDFS為了做到可靠性,創(chuàng)建了多份數(shù)據(jù)塊的復(fù)制(Replicas),并將它們放置在服務(wù)器群的計算節(jié)點(diǎn)中,MapReduce就可以在它們所在的節(jié)點(diǎn)上處理這些數(shù)據(jù)。Hadoop 是由HDFS、MapReduce、HBase、Hive和ZooKeeper等組成,其中,HDFS和MapReduce是兩個最基礎(chǔ)、最重要的成員,其他子項(xiàng)目提供配套服務(wù)。總體來說Hadoop具有以下幾個主要特點(diǎn):1.擴(kuò)展性強(qiáng):能可靠地存儲和處理千兆字節(jié)(GB)數(shù)據(jù)。2.成本低:可以通過普通機(jī)器組成的服務(wù)器群來分發(fā)以及處理數(shù)據(jù),服務(wù)器群總計可達(dá)數(shù)千個節(jié)點(diǎn)。3.高效率:通過分發(fā)數(shù)據(jù),Hadoop可以在數(shù)據(jù)所在的節(jié)點(diǎn)上并行地處理它們,非??焖?。4.可靠性好:Hadoop能自動地維護(hù)數(shù)據(jù)的多份復(fù)制,并且在任務(wù)失敗后能自動地重新部署計算任務(wù)。
Hadoop Map/Reduce是一個軟件構(gòu)架,基于它寫出來的應(yīng)用程序能夠運(yùn)行在由上千個機(jī)器組成的大型集群上,并以一種可靠容錯的方式并行處理上T級的數(shù)據(jù)集。一個Map/Reduce作業(yè)(job)通常會把輸入的數(shù)據(jù)集切分為若干獨(dú)立的數(shù)據(jù)塊,由map任務(wù)(task)以完全并行的方式處理它們。構(gòu)架會對map的輸出先進(jìn)行排序,然后把結(jié)果輸入給reduce任務(wù)。通常,作業(yè)的輸入和輸出都會被存儲在文件系統(tǒng)中。整個框架負(fù)責(zé)任務(wù)的調(diào)度和監(jiān)控,以及重新執(zhí)行已經(jīng)失敗的任務(wù)。
Map/Reduce框架和分布式文件系統(tǒng)通常是運(yùn)行在一組相同的節(jié)點(diǎn)上的,也就是說,計算節(jié)點(diǎn)和存儲節(jié)點(diǎn)通常在一起。這種配置允許框架在數(shù)據(jù)節(jié)點(diǎn)上高效地調(diào)度任務(wù),可以非常高效地利用整個集群的網(wǎng)絡(luò)帶寬。Map/Reduce框架由一個單獨(dú)的主(master)JobTracker和每個集群節(jié)點(diǎn)一個次(slave)TaskTracker共同組成。Master負(fù)責(zé)調(diào)度構(gòu)成一個作業(yè)的所有任務(wù),這些任務(wù)分布在不同的slave上,master監(jiān)控它們的執(zhí)行,重新執(zhí)行已經(jīng)失敗的任務(wù);而slave僅負(fù)責(zé)執(zhí)行由master指派的任務(wù)。
應(yīng)用程序至少應(yīng)該指明輸入/輸出的位置,并通過實(shí)現(xiàn)合適的接口或抽象類提供map和reduce函數(shù),再加上其他作業(yè)的參數(shù),就構(gòu)成了作業(yè)配置(job configuration)。然后,Hadoop的job client提交作業(yè)和配置信息給JobTracker,后者負(fù)責(zé)分發(fā)這些軟件和配置信息給slave,調(diào)度任務(wù)并監(jiān)控它們的執(zhí)行,同時提供狀態(tài)和診斷信息給job client。
MapReduce框架的核心步驟主要分成兩個部分:Map和Reduce。當(dāng)向MapReduce框架提交一個計算作業(yè)時,它會首先把計算作業(yè)拆分成若干個Map任務(wù),然后分配到不同的節(jié)點(diǎn)上去執(zhí)行。每一個Map任務(wù)處理輸入數(shù)據(jù)中的一部分,當(dāng)Map任務(wù)完成后,它會生成一些中間文件,這些中間文件將會作為Reduce任務(wù)的輸入數(shù)據(jù)。Reduce任務(wù)的主要目標(biāo)就是把前面若干個Map的輸出匯總到一起并輸出。
MapReduce的工作過程分為兩個階段:map階段和reduce階段。每個階段都有鍵/值對作為輸入和輸出,并且它們的類型可由程序員選擇。程序員還具體定義了兩個函數(shù):map函數(shù)和reduce函數(shù)。在處理大數(shù)據(jù)集的過程中,將大數(shù)據(jù)集分解為成千上萬個小數(shù)據(jù)集,每個(或若干個)數(shù)據(jù)集分別由集群中的一個結(jié)點(diǎn)進(jìn)行處理并生成中間結(jié)果,這些中間結(jié)果又由大量的結(jié)點(diǎn)進(jìn)行合并,形成最終結(jié)果。如圖1所示。
HDFS是Google GFS的開源版本,是一個高度容錯的分布式文件系統(tǒng),它能夠提供高吞吐量的數(shù)據(jù)訪問,適合存儲PB級的大文件。HDFS采用Master/Slave結(jié)構(gòu);NameNode維護(hù)集群內(nèi)的元數(shù)據(jù),對外提供創(chuàng)建、打開、刪除和重命名文件或目錄的功能;DataNode存儲數(shù)據(jù),并負(fù)責(zé)處理數(shù)據(jù)的讀寫請求。DataNode定期向NameNode上報心跳,NameNode通過響應(yīng)心跳來控制DataNode。如圖2所示。
NameNode和DataNode被設(shè)計成可以在普通的機(jī)器上運(yùn)行,這些機(jī)器一般運(yùn)行著Linux操作系統(tǒng)。HDFS采用Java語言開發(fā),因此任何支持Java的機(jī)器都可以部署NameNode或DataNode。由于采用了可移植性極強(qiáng)的Jave語言,使得HDFS可以部署到多種類型的機(jī)器上。一臺機(jī)器上只運(yùn)行一個NameNode實(shí)例,而集群中的其它機(jī)器分別運(yùn)行一個DataNode實(shí)例。集群中單一NameNode的結(jié)構(gòu)大大簡化了系統(tǒng)的架構(gòu)。NameNode是所有HDFS元數(shù)據(jù)的仲裁者和管理者,用戶數(shù)據(jù)不會流過NameNode。
(1)HDFS讀取數(shù)據(jù)過程
客戶端通過調(diào)用DistributedFileSystem對象的open()來打開文件。對于HDFS來說,這個對象是分布式文件系統(tǒng)的一個實(shí)例。分布式文件系統(tǒng)(DistributedFileSystem)通過使用RPC來調(diào)用名稱節(jié)點(diǎn),以確定文件開頭部分的塊的位置。對于每一個塊,名稱節(jié)點(diǎn)返回具有該塊的數(shù)據(jù)節(jié)點(diǎn)地址。此外,這些數(shù)據(jù)節(jié)點(diǎn)根據(jù)它們與客戶端的距離來排序。如果該客戶端本身就是一個數(shù)據(jù)節(jié)點(diǎn),便從本地數(shù)據(jù)節(jié)點(diǎn)中讀取。分布式文件系統(tǒng)返回一個FSDataInputStream對象給客戶端讀取數(shù)據(jù)。FSDataInputStream轉(zhuǎn)而包裝了一個DFSInputStream對象。接著,客戶端對這個輸入流調(diào)用read()操作。存儲著文件開頭部分的塊的數(shù)據(jù)節(jié)點(diǎn)地址的FSDataInputStream 隨即與這些塊最近的數(shù)據(jù)節(jié)點(diǎn)相連接。通過在數(shù)據(jù)流中重復(fù)調(diào)用read(), 數(shù)據(jù)會從數(shù)據(jù)節(jié)點(diǎn)返回客戶端。到達(dá)塊的末端時,DFSInputStream會關(guān)閉與數(shù)據(jù)節(jié)點(diǎn)間的聯(lián)系,然后為下一個塊找到最佳的數(shù)據(jù)節(jié)點(diǎn)。客戶端只需要讀取一個連續(xù)的流,這些對于客戶端來說都是透明的??蛻舳藦牧髦凶x取數(shù)據(jù)時,塊是按照DFSInputStream打開與數(shù)據(jù)節(jié)點(diǎn)的新連接的順序讀取。它也會調(diào)用名稱節(jié)點(diǎn)來檢索下一組需要的塊的數(shù)據(jù)節(jié)點(diǎn)的位置。一旦客戶端完成讀取,就對文件系統(tǒng)數(shù)據(jù)輸入流調(diào)用close()操作。如圖3所示。
(2)HDFS寫入數(shù)據(jù)過程
客戶端通過在分布式文件系統(tǒng)(DistributedFileSystem)中調(diào)用create()來創(chuàng)建文件。分布式文件系統(tǒng)通過一個RPC去調(diào)用名稱節(jié)點(diǎn),在文件系統(tǒng)的命名空間中創(chuàng)建一個新的文件,這時沒有塊與之相聯(lián)系。名稱節(jié)點(diǎn)執(zhí)行各種不同的檢查以確保這個文件不存在,并且客戶端有可以創(chuàng)建文件的適當(dāng)?shù)脑S可。如果這些檢查通過,名稱節(jié)點(diǎn)就會生成一個新文件的記錄;否則,文件創(chuàng)建失敗并向客戶端拋出一個IOException異常。分布式文件系統(tǒng)返回一個文件系統(tǒng)數(shù)據(jù)輸出流,讓客戶端開始寫入數(shù)據(jù)。就像讀取一樣,文件系統(tǒng)數(shù)據(jù)輸出流控制一個DFSOutputStream,負(fù)責(zé)處理數(shù)據(jù)節(jié)點(diǎn)和名稱節(jié)點(diǎn)之間的通信。在客戶端寫入數(shù)據(jù)時,DFSOutputStream將它分成一個個的包,寫入內(nèi)部的隊列,即數(shù)據(jù)隊列。數(shù)據(jù)隊列隨數(shù)據(jù)流流動,數(shù)據(jù)流的責(zé)任是根據(jù)適合的數(shù)據(jù)節(jié)點(diǎn)的列表來要求這些節(jié)點(diǎn)為副本分配新的塊。DFSOutputStream也有一個內(nèi)部的包隊列來等待數(shù)據(jù)節(jié)點(diǎn)確認(rèn),稱為確認(rèn)隊列。一個包只有在被管線中所有節(jié)點(diǎn)確認(rèn)后才會被移出確認(rèn)隊列??蛻舳送瓿蓴?shù)據(jù)的寫入后,就會在流中調(diào)用close()操作。在向名稱節(jié)點(diǎn)發(fā)送完信息之前,此方法會將余下的所有包放入數(shù)據(jù)節(jié)點(diǎn)管線并等待確認(rèn)。名稱節(jié)點(diǎn)已經(jīng)知道文件由哪些塊組成,所以它只需在返回成功前等待塊進(jìn)行最小量的復(fù)制。如圖4所示。
(3)HDFS負(fù)載均衡
HDFS集群會處于長時間運(yùn)行狀態(tài),尤其是大量的delete操作后,集群中各個DataNode上的空間使用率可能會存在比較大的差異。所以需要一種機(jī)制使各個DataNode保持平衡,防止少數(shù)DataNode存儲過多的文件。少數(shù)使用率過高的DataNode會導(dǎo)致對其的數(shù)據(jù)訪問效率變低,并且如果該DataNode停止服務(wù),則需要更多的時間進(jìn)行恢復(fù),對集群也會造成更大的影響。
Hadoop中提供了balancer的機(jī)制。Hadoop balancerthreshold
閥值設(shè)置的越小,HDFS各個DataNode的使用率越接近,整個集群也更加平衡,但會消耗更多的時間和資源來達(dá)到該平衡狀態(tài)。如果閥值設(shè)置的過小,對于操作非常頻繁的HDFS集群,有可能永遠(yuǎn)也不會達(dá)到該閥值所指定的平衡狀態(tài)。閥值設(shè)置越大HDFS各個DataNode的使用率差距越大,但是會較容易達(dá)到平衡狀態(tài)。
在balancer的過程,Hadoop會遞歸的把block從使用率高的DataNode轉(zhuǎn)移到那些使用率低的DataNode上。在每次遞歸的過程中,單個DataNode轉(zhuǎn)移或者接受的block不得超過10G或者它的存儲能力的閥值(根據(jù)該Datanode的總空間決定)。并且每次遞歸過程的執(zhí)行也不能超過20分鐘。在每次遞歸過后,會更新DataNode的最新狀態(tài)信息,決定下一次遞歸的執(zhí)行。
整個balancer過程是比較復(fù)雜的,首先會計算集群總的使用率,然后分別計算各個正常運(yùn)行的DataNode結(jié)點(diǎn)的使用率。根據(jù)balancer閥值對各個DataNode進(jìn)行分類,找到那些使用率過高的和使用率過低的結(jié)點(diǎn)。
云計算技術(shù)的興起正在顛覆傳統(tǒng)的分布式數(shù)據(jù)存儲架構(gòu),面對當(dāng)前PB級的海量數(shù)據(jù)存儲需求,傳統(tǒng)的SAN、NAS或IP存儲的容量、可靠性和性能擴(kuò)展等方面已不能滿足當(dāng)前數(shù)據(jù)存儲和管理要求。如受到物理設(shè)備(異構(gòu)的存儲機(jī)構(gòu)、磁盤驅(qū)動器的數(shù)量、內(nèi)存大小和控制器性能)的限制,會造成許多功能上的限制,如:支持文件系統(tǒng)的數(shù)量、快照或數(shù)據(jù)備份的數(shù)量等。系統(tǒng)一旦遇到瓶頸,就會不斷地要求用戶升級到更大的存儲系統(tǒng)或添加更多的存儲管理設(shè)備,從而增加了成本,而基于云計算架構(gòu)的分布式存儲技術(shù),能充分利用云計算新技術(shù),結(jié)合其超大規(guī)模、高可擴(kuò)展性、廉價性、高可靠性等特點(diǎn)來滿足當(dāng)前PB級別的海量數(shù)據(jù)存儲管理要求?!?/p>