廖先富 劉俊男
摘要: 隨著多媒體技術(shù)及Internet的迅速發(fā)展,三維數(shù)據(jù)模型的數(shù)據(jù)快速增加,大容量高速存儲(chǔ)系統(tǒng)為三維模型的海量存儲(chǔ)提供了基本保障,模型數(shù)據(jù)庫(kù)的研究將對(duì)工業(yè)生產(chǎn)、醫(yī)學(xué)數(shù)據(jù)管理、機(jī)械制造和生產(chǎn)、航空航天領(lǐng)域、罪犯識(shí)別系統(tǒng)等方面提供了有力的支持。本文將構(gòu)建一個(gè)基于Hadoop的HDFS文件存儲(chǔ)功能與Django相結(jié)合構(gòu)建一個(gè)云端分布式三維數(shù)據(jù)存儲(chǔ)系統(tǒng)。通過(guò)該系統(tǒng)將解決三維數(shù)據(jù)目前單一存儲(chǔ)的問(wèn)題。該系統(tǒng)將對(duì)于三維模型數(shù)據(jù)提供“云集中”存儲(chǔ)。用戶將數(shù)據(jù)模型統(tǒng)一上傳至三維模型數(shù)據(jù)庫(kù)中,在構(gòu)建三維場(chǎng)景時(shí),用戶能夠通過(guò)模型管理系統(tǒng)系統(tǒng)的接口,實(shí)現(xiàn)模型庫(kù)中三維模型的檢索、導(dǎo)入、移除功能。
【關(guān)鍵詞】云計(jì)算三維模型 Django HadoopHDFS
1 云存儲(chǔ)技術(shù)及HDFS簡(jiǎn)介
1.1 云存儲(chǔ)的概念及結(jié)構(gòu)
云存儲(chǔ)是在現(xiàn)有的云計(jì)算基礎(chǔ)上發(fā)展而來(lái),利用集群與網(wǎng)絡(luò)技術(shù)將多臺(tái)服務(wù)器硬盤(pán)或其他存儲(chǔ)設(shè)備連接成一個(gè)虛擬的云硬盤(pán),在底層屏蔽了不同存儲(chǔ)介質(zhì)的差異,把網(wǎng)絡(luò)中各種存儲(chǔ)設(shè)備協(xié)調(diào)一致進(jìn)行工作,共同對(duì)外提供數(shù)據(jù)存儲(chǔ)及業(yè)務(wù)訪問(wèn)功能的一種新的網(wǎng)絡(luò)存儲(chǔ)方式,使用戶在操作時(shí)感覺(jué)就像在操作一個(gè)的存儲(chǔ)設(shè)備一樣。云存儲(chǔ)伴隨云計(jì)算技術(shù)發(fā)展而產(chǎn)生,是對(duì)云計(jì)算的延伸和發(fā)展。
云存儲(chǔ)與傳統(tǒng)的存儲(chǔ)設(shè)備不同,云存儲(chǔ)一般由底層的多臺(tái)存儲(chǔ)設(shè)備構(gòu)成,高層由對(duì)應(yīng)的應(yīng)用軟件、客戶端以及訪問(wèn)接口等組成。通過(guò)訪問(wèn)接口層,用戶可對(duì)云存儲(chǔ)進(jìn)行操作,同時(shí)也在一定程度上保證了數(shù)據(jù)的安全。
1.2 HDFS設(shè)計(jì)理念
1.2.1 HDFS分布存儲(chǔ)
HDFS的設(shè)計(jì)理念是當(dāng)數(shù)據(jù)集的大小超過(guò)單臺(tái)數(shù)據(jù)計(jì)算機(jī)的存儲(chǔ)能力時(shí)就有必要將其區(qū)并存儲(chǔ)到若干臺(tái)單獨(dú)的計(jì)算機(jī)上。HDFS作為Hadoop生態(tài)圈的基礎(chǔ),一流式數(shù)據(jù)訪問(wèn)模式來(lái)存儲(chǔ)超大文件,具有一下特點(diǎn):
(1)適合存儲(chǔ)超大文件。由于HDFS的底層建立在多存儲(chǔ)模塊之上,所以一般存儲(chǔ)的文件在GB甚至TB級(jí)別。
(2)運(yùn)行在廉價(jià)硬件之上。HDFS在設(shè)計(jì)之初就考慮到了在集群足夠大時(shí),節(jié)點(diǎn)故障并不是小概率事件,而是一種常態(tài)。所以在設(shè)計(jì)之初就考慮到了故障的處理,所以當(dāng)節(jié)點(diǎn)發(fā)生故障時(shí)HDFS能夠繼續(xù)運(yùn)行并且不讓用戶感覺(jué)到中斷。因此HDFS并不需要運(yùn)行在高可靠但是昂貴的服務(wù)器上,普通的服務(wù)器即可。這也使得企業(yè)的云服務(wù)成本進(jìn)一步得到降低。
(3)流式訪問(wèn)。在HDFS的設(shè)計(jì)中認(rèn)為數(shù)據(jù)一次寫(xiě)入需要多次讀取,所以采用了流式訪問(wèn)。
1.2.2 HDFS的組成
HDFS組成如1圖所示。
(1)塊(block)。
每個(gè)磁盤(pán)都有默認(rèn)的數(shù)據(jù)塊大小,這是磁盤(pán)進(jìn)行讀/寫(xiě)的的最基本單位,用戶在使用文件系統(tǒng)對(duì)文件驚醒讀寫(xiě)時(shí)完全不需要知道塊的細(xì)節(jié),這些對(duì)用戶都是透明的。HDFS同樣有塊的概念,作為HDFS中最基本的存儲(chǔ)單位,默認(rèn)大小為64MB,相對(duì)于普通的文件塊,HDFS中的塊設(shè)計(jì)的就非常大,這樣設(shè)計(jì)的目的是最小化尋址開(kāi)銷(xiāo)。
其中Tf為尋址所花費(fèi)的時(shí)間,Te代表磁盤(pán)傳輸文件所需時(shí)間。根據(jù)公式可知隨著塊的增大,尋址所花費(fèi)的時(shí)間就會(huì)減小,因此效率e的比例就會(huì)增大。
(2) NameNode和SecondaryNameNode。
(3) DataNode。
(4) HDFS客戶端。
1.2.3 HDFS容錯(cuò)機(jī)制
(1) HDFS數(shù)據(jù)塊副本機(jī)制在HDFS中一個(gè)文件可能有許多的數(shù)據(jù)塊( Block)組成,每個(gè)數(shù)據(jù)塊的副本的默認(rèn)數(shù)量是3,其中兩個(gè)放在同一個(gè)機(jī)架中,一個(gè)放在其他機(jī)架。這樣有效的避免了因外界原因使得某一存儲(chǔ)介質(zhì)不可用而導(dǎo)致數(shù)據(jù)丟失問(wèn)題。
(2)心跳檢測(cè)。 在NameNode和DataNode之間維持心跳檢測(cè),當(dāng)網(wǎng)絡(luò)出現(xiàn)故障或者擁堵等原因?qū)е翫ataNode發(fā)送的心跳包并未讓NameNode接收到,該DataNode被判定無(wú)效且不會(huì)發(fā)送任何新的1/0操作給該DataNode。
(3) HDFS負(fù)載均衡。NameNode根據(jù)DataNode發(fā)送的心跳信息和數(shù)據(jù)塊信息來(lái)掌握DaraNode的當(dāng)前狀態(tài),HDFS有一個(gè)balancer工具,可以由管理員啟動(dòng),用來(lái)遷移DataNode之間的數(shù)據(jù)塊,當(dāng)集群負(fù)載較高的時(shí)候不宜采用,因?yàn)榭赡軙?huì)造成網(wǎng)絡(luò)阻塞,造成客戶端延遲過(guò)大。
(4)檢測(cè)文件塊的完整。HDFS會(huì)記錄每個(gè)創(chuàng)建文件的所有塊的校驗(yàn)和,當(dāng)以后檢索文件塊或者發(fā)現(xiàn)從摸個(gè)節(jié)點(diǎn)獲取文件塊時(shí),會(huì)首先進(jìn)行確認(rèn)校驗(yàn)和是否一致,如果不一致就會(huì)放棄該DataNode上的文件塊,從其他DataNode上獲取。
2 Djang0簡(jiǎn)介
Dj ango是一個(gè)開(kāi)放源代碼的Web應(yīng)用框架,由Python寫(xiě)成。采用了MVC的框架模式,即模型M,視圖V和控制器C。它最初是被開(kāi)發(fā)來(lái)用于管理勞倫斯出版集團(tuán)旗下的一些以新聞內(nèi)容為主的網(wǎng)站的,即是CMS(內(nèi)容管理系統(tǒng))軟件。Django的主要目的是簡(jiǎn)便、快速的開(kāi)發(fā)數(shù)據(jù)庫(kù)驅(qū)動(dòng)的網(wǎng)站。它強(qiáng)調(diào)代碼復(fù)用,多個(gè)組件可以很方便的以“插件”形式服務(wù)于整個(gè)框架,Dj ango有許多功能強(qiáng)大的第三方插件,你甚至可以很方便的開(kāi)發(fā)出自己的工具包。這使得Django具有很強(qiáng)的可擴(kuò)展性。它還強(qiáng)調(diào)快速開(kāi)發(fā)和DRY(Do Not RepeatYourself)原則。
Django的優(yōu)點(diǎn):
(1)自助管理后臺(tái),admin interface是Django里比較吸引眼球的一項(xiàng)contrib,讓你幾乎不用寫(xiě)一行代碼就擁有一個(gè)完整的后臺(tái)管理界面。
(2)雖然Django自帶的ORM不如SQLAlchemy強(qiáng)大,但也不弱。一般來(lái)說(shuō)可以不怎么使用SQL語(yǔ)句,每條記錄都是一個(gè)對(duì)象,而取對(duì)象的關(guān)聯(lián),易如反掌。
(3) URL design,利用正則表達(dá)式進(jìn)行構(gòu)建URL??焖偾揖哂泻軓?qiáng)的適用性。
3 項(xiàng)目構(gòu)建
3.1 項(xiàng)目簡(jiǎn)介
隨著多媒體技術(shù)及Internet的迅速發(fā)展,三維數(shù)據(jù)模型的數(shù)據(jù)快速增加,大容量高速存儲(chǔ)系統(tǒng)為三維模型的海量存儲(chǔ)提供了基本保障,模型數(shù)據(jù)庫(kù)的研究將對(duì)工業(yè)生產(chǎn)、醫(yī)學(xué)數(shù)據(jù)管理、機(jī)械制造和生產(chǎn)、航空航天領(lǐng)域、罪犯識(shí)別系統(tǒng)等方面提供了有力的支持。為了解決單一服務(wù)器并不能滿足大量文件存儲(chǔ)的難題,分布式的存儲(chǔ)被提出,分布式的出現(xiàn)解決了單一機(jī)器難以滿足存儲(chǔ)要求的難題。Hadoop是分布式的一種優(yōu)秀的實(shí)現(xiàn)。Dj ango則是一款優(yōu)秀的web框架,利用Dj ango可以快速的開(kāi)發(fā)出應(yīng)用。因此本文將結(jié)合Dj ango與Hadoop的Hdfs設(shè)計(jì)出存儲(chǔ)三維模型的web版數(shù)據(jù)庫(kù)。
3.2 項(xiàng)目架構(gòu)
3.2.1 系統(tǒng)架構(gòu)
三維模型數(shù)據(jù)庫(kù)項(xiàng)目的存儲(chǔ)層為Hadoop集群,利用HDFS作為三維模型的存儲(chǔ)介質(zhì)。通過(guò)HDFS的作為存儲(chǔ)介質(zhì)可以控制模型文件的副本數(shù)量,達(dá)到安全,高效的目的。數(shù)據(jù)層利用Mysql或者HBASE作為存儲(chǔ)三維模型的信息。服務(wù)層利用Django進(jìn)行頁(yè)面的展示或者下載。如圖2,圖3所示。
3.2.2 業(yè)務(wù)邏輯
用戶通過(guò)注冊(cè)獲取屬于自己的數(shù)據(jù)庫(kù),在自己的數(shù)據(jù)庫(kù)中可以進(jìn)行上傳,預(yù)覽,下載操作。見(jiàn)圖4。
3.3 項(xiàng)目的關(guān)鍵實(shí)現(xiàn)
3.3.1 Django用戶認(rèn)證
Dj ango內(nèi)置了用戶認(rèn)證功能,可以免于自己編寫(xiě)登錄認(rèn)證功能。要使用Django自帶的認(rèn)證功能,首先要通過(guò)from django.contribimport auth導(dǎo)入auth模塊。通過(guò)auth模塊提供的函數(shù)實(shí)現(xiàn)注冊(cè)功能。代碼展示如下:
deflogin(request):
if request.method=='GET':
return render(request, "Iogin.html")
ifrequest.method=="POST":
username=request.POSTget("usemame”,””)
password=request.POSTget("password”,””)
U S e r
=authenticate(username=username,password=password)
if user is not None and user.is active:
auth.login(request, user)
print(user)
context={
”user": user,
)
return HttpResponseRedirect(/page/l')
else:
context={
”user": None,
err':”密碼或者用戶名錯(cuò)誤”
)
retum render(request, 'login.html',context)
3.3.2 python操作HDFS
Hadoop的底層接口是通過(guò)Java API提供的,但是Dj ango是由python語(yǔ)言進(jìn)行開(kāi)發(fā),因此,為了使dj ango能對(duì)HDFS進(jìn)行操作,所以使用了pyhdfs的python包進(jìn)行操作??梢酝ㄟ^(guò)pip install pyhdfs進(jìn)行安裝。Pyhdfs是基于WEBHDFS封裝的python包,可以通過(guò)簡(jiǎn)單的函數(shù)調(diào)用來(lái)達(dá)到對(duì)HDFS的操作。
3.3.3 Django與HDFS的整合
在構(gòu)建web應(yīng)用時(shí),三維模型文件的上傳到HDFS,需要通過(guò)Dj ango將文件上傳到HDFS中。前端頁(yè)面通過(guò)form表單進(jìn)行上傳,后端的django接受上傳的文件塊進(jìn)行保存到臨時(shí)緩存目錄,再由pyhdfs進(jìn)行上傳到HDFS中。如圖6所示在下載時(shí)通過(guò)Mysql數(shù)據(jù)庫(kù)中三維模型文件的HDFS引用地址,再利用pyhdfs進(jìn)行下載。圖6所示。
部分代碼如下:
4 總結(jié)
本系統(tǒng)的開(kāi)發(fā)建立了一種新型的分布式存儲(chǔ)方式,解決來(lái)了傳統(tǒng)單一服務(wù)器不能存儲(chǔ)海量三維模型的問(wèn)題。
為需要大量使用三維模型的企業(yè)及用戶帶來(lái)了很大的便利。同時(shí)利用Djnago進(jìn)行開(kāi)發(fā),極大的簡(jiǎn)化了開(kāi)發(fā)的難度,為后期的拓展開(kāi)發(fā)提供了便利。當(dāng)然在本系統(tǒng)中默認(rèn)考慮的是大型的三維模型文件,由于HDFS本身的特性(每個(gè)Block的大小為128M),并不適合對(duì)小型模型的存儲(chǔ)。