景維鵬,田冬雪
(東北林業(yè)大學(xué)信息與計算機工程學(xué)院,黑龍江 哈爾濱 150040)
近年來,隨著航空航天遙感技術(shù)的迅猛發(fā)展,人們所能獲取的影像數(shù)據(jù)(如航空攝影像片、衛(wèi)星遙感像片、地面攝影像片等)的數(shù)量正在呈幾何級數(shù)增長[1]。遙感圖像的快速存儲與查詢,在對地觀測、軍事、勘探等領(lǐng)域發(fā)揮著重要作用。海量影像數(shù)據(jù)如何高效地存儲、組織、管理與發(fā)布,提高處理和分發(fā)效率,已成為迫切需要解決的問題。
傳統(tǒng)的基于文件系統(tǒng)[2]的管理方式利用了文件系統(tǒng)的讀寫優(yōu)勢,但是不能保證數(shù)據(jù)的完整性,在多用戶并發(fā)訪問時處理效率低。文獻[3]提出了一種使用Oracle數(shù)據(jù)庫來管理影像數(shù)據(jù)的方法,有效地解決了數(shù)據(jù)的完整性和一致性等問題。然而,在海量影像數(shù)據(jù)面前,這種方法受單個節(jié)點硬件設(shè)備的限制存在單節(jié)點故障、可擴展性不足、查詢效率低等問題。隨著開源大數(shù)據(jù)技術(shù)的發(fā)展,一些使用大數(shù)據(jù)技術(shù)來處理遙感影像的方法相繼被提出[4 - 6]。文獻[4]采用Hadoop平臺存儲矢量空間數(shù)據(jù),該方法有效地解決了單節(jié)點故障和擴展性不足等問題。但是,沒有考慮影像數(shù)據(jù)在存儲過程中產(chǎn)生許多小文件的問題,導(dǎo)致占用了大量的主節(jié)點內(nèi)存,增加了主節(jié)點負擔。文獻[5]在文獻[4]的基礎(chǔ)上提出了一種分布式Key-Value存儲模型來管理海量影像數(shù)據(jù),將小文件合并存儲為一個大的數(shù)據(jù)文件,有效地解決了大量小文件問題。但是,沒有對每層影像設(shè)計元數(shù)據(jù)進行描述,從而加大了數(shù)據(jù)的檢索時間。文獻[6]對文獻[5]進行了改進,對每層影像設(shè)計了元數(shù)據(jù),將存儲過程中產(chǎn)生的瓦片利用MapFile進行合并,提高了影像數(shù)據(jù)的訪問能力。但是,以上方法均是將影像數(shù)據(jù)直接存儲在HDFS上,由于HDFS不支持在文件的任意位置進行修改且不適合吞吐量小和要求低延時的操作,所以上述方法存在不能直接對任意位置的數(shù)據(jù)進行更新和查詢時間過長的問題。
為了解決上述問題,利用非關(guān)系型數(shù)據(jù)庫HBase對遙感影像數(shù)據(jù)進行存儲受到了國內(nèi)外專家學(xué)者的青睞。文獻[7]將處理后的影像數(shù)據(jù)存儲在HBase中,可以對任意位置的數(shù)據(jù)進行更新操作,解決了遙感影像數(shù)據(jù)中存儲的多時相問題,但并沒有考慮數(shù)據(jù)的插入效率。文獻[8]在文獻[7]的基礎(chǔ)上,設(shè)計了基于Key-Value的分層索引結(jié)構(gòu),在保持高容錯能力和高可用性的同時保持高插入吞吐量和大數(shù)據(jù)量。但是,分層的索引結(jié)構(gòu)加大了索引的存儲空間,當數(shù)據(jù)量大時不利于管理。為了縮小索引空間,文獻[9]則將四叉樹與網(wǎng)格索引分別作為主要和次要索引,整體索引所需要的空間也更小,且在范圍查詢時具有高效的性能,然而這種方法的查詢時間較長。為了縮短查詢時間,文獻[10]設(shè)計了二級索引機制,在減少查詢時間的同時支持對地理位置的高并發(fā)訪問。文獻[11]在文獻[10]基礎(chǔ)上利用協(xié)處理器實現(xiàn)了二次索引,實現(xiàn)了基于HBase的氣象數(shù)據(jù)分布式實時查詢方案,有效地縮短了查詢時間。上述方法均是利用二級索引來縮短空間數(shù)據(jù)查詢時間,對遙感影像數(shù)據(jù)的研究較少且較少考慮利用遙感影像本身特點對HBase存儲模型進行優(yōu)化。因此,本文提出了一種基于HBase的分布式存儲與查詢方法。該方法利用MapReduce并行計算框架和HBase對于非結(jié)構(gòu)化數(shù)據(jù)的存儲優(yōu)勢構(gòu)建了遙感影像存儲模型。
為了實現(xiàn)對影像數(shù)據(jù)的分布式存儲,本文在傳統(tǒng)瓦片金字塔的影像數(shù)據(jù)存儲的基礎(chǔ)上,設(shè)計了適合影像數(shù)據(jù)存儲的HBase模型。通過對影像數(shù)據(jù)建立索引和元數(shù)據(jù)描述,提高了影像數(shù)據(jù)的處理效率。另外,通過設(shè)計過濾列族達到了篩選數(shù)據(jù)的目的,從而提高了查詢的準確率。
影像數(shù)據(jù)分塊組織中最常用的方法是建立具有多尺度層級結(jié)構(gòu)特征的格網(wǎng)影像金字塔模型,使用戶能夠根據(jù)需要對特定分辨率層級、特定空間區(qū)域范圍的影像塊進行訪問[12]。傳統(tǒng)的倍率方法[13]通過2n×2n大小的原始影像進行分層操作,本文對上述方法進行改進,可以使其對任意分辨率的影像進行分層分塊操作。
假設(shè)原始影像的分辨率為n×m,瓦片的大小為 2p×2p(p=0,1,2,…),則需要構(gòu)建的金字塔層數(shù)L=min(L1,L2)。
其中L1需要滿足:
(1)
同理,L2需要滿足:
(2)
得到不同層次的影像層之后,采用均勻網(wǎng)格法對每層影像進行劃分。在瓦片劃分過程中如果存在不足2p×2p像素的“尾塊”時,可先對其補全再進行剖分。其中 “尾塊”的大小TailX和TailY可由下列公式獲得。
TailX=2-k×n-(2-k×nmod 2p)
(3)
TailY=2-k×n-(2-k×mmod 2p)
(4)
其中,k代表瓦片數(shù)據(jù)所在的影像層,n和m代表原始圖像的分辨率,mod為取余函數(shù),2p代表瓦塊的大小。在本文中2p=128 與ArcSDE建立影像金字塔時默認的塊大小一致。
Figure 1 Division of image data圖1 影像數(shù)據(jù)的劃分
由圖1可知,在對影像數(shù)據(jù)分層處理之后,選取任意一層的影像數(shù)據(jù)進行網(wǎng)格劃分,當出現(xiàn)“尾塊”時通過公式(3)和公式(4)得到“尾塊”的大小,通過向左平移進行補全。
本文基于Key-Value的存儲結(jié)構(gòu)并結(jié)合分布式數(shù)據(jù)庫HBase的存儲特點,將網(wǎng)格ID和Hilbert曲線結(jié)合后的值作為key,每個瓦片的描述信息分別作為value,組成〈keym,valuem〉鍵值對,對應(yīng)地存儲在不同的列中。
影像數(shù)據(jù)的存儲模型如表1所示,表中的元數(shù)據(jù)區(qū)存儲每層影像的元數(shù)據(jù),用于在檢索時快速得到該層影像的描述,縮短查詢時間;主數(shù)據(jù)區(qū)用于存放該影像數(shù)據(jù)的全部瓦片信息。其中GeoInfo列族用于存放該瓦片數(shù)據(jù)的描述信息,F(xiàn)ilter列族用于存放數(shù)據(jù)過濾信息。
2.2.1 元數(shù)據(jù)的設(shè)計
基于HDFS存儲的影像數(shù)據(jù),通常將元數(shù)據(jù)的相關(guān)信息存儲在Master節(jié)點的內(nèi)存中[14]。為了提高數(shù)據(jù)的存儲和查詢效率,本文將每層影像的元數(shù)據(jù)信息存儲在HBase表中,在查詢時可以快速得到該層影像的描述信息。
每層影像的元數(shù)據(jù)包括四個信息,分別是該影像數(shù)據(jù)所在的層號k、該層瓦片數(shù)據(jù)的分辨率X=n×2-k和Y=m×2-k、該層影像數(shù)據(jù)的經(jīng)緯度范圍以及該層瓦片的真實坐標的橫向跨度TileSpanX和縱向跨度TileSpanY。其中瓦片的TileSpanX和TileSpanY可由以下公式獲得:
(5)
(6)
其中,(Xmin,Ymin),(Xmax,Ymax)分別代表該影像數(shù)據(jù)的起始經(jīng)緯度坐標,k代表該瓦片所在的影像層,L代表該影像數(shù)據(jù)金字塔的總層數(shù)。
2.2.2 索引建立
本文通過對每層影像數(shù)據(jù)構(gòu)建索引,達到了提高數(shù)據(jù)查詢效率的目的。傳統(tǒng)的基于HBase的存儲方法采用將查詢條件拼接到RowKey中的方法,進行多條件查詢。但是,這種方法導(dǎo)致索引所需的空間隨著查詢條件的增加而增多。在遙感數(shù)據(jù)存儲中,這種方法沒有考慮到數(shù)據(jù)的空間臨近性,從而導(dǎo)致了遙感數(shù)據(jù)空間位置的跳躍,增加了查詢時間。
為了保證遙感數(shù)據(jù)的空間臨近性,本文在利用網(wǎng)格對影像進行劃分的基礎(chǔ)上使用Hilbert曲線進行填充。由于在HBase中,RowKey是按照字典排序進行存儲的,因此需要對Hilbert值進行轉(zhuǎn)化,最終RowKey的值為:
RowKey=k+L(L(φ))+L(φ)+φ
(7)
其中,k代表了當前遙感影像所在的層,L(x)表示當前x的長度,φ表示當前網(wǎng)格所在的Hibert編碼,“+”用來分割每個字符串。這種方法在保證影像數(shù)據(jù)空間臨近性的同時,縮小了索引所需要的空間。
改進后的索引結(jié)構(gòu)在HBase表中的存儲結(jié)構(gòu)如圖2所示。其中圖2a表示瓦片數(shù)據(jù)在網(wǎng)格中的位置;圖2b表示經(jīng)Hilbert填充后得到的改進的HID值;圖2c表示網(wǎng)格中第0層瓦片數(shù)據(jù)在HBase表中的存放位置。
由圖2c可知,數(shù)據(jù)在HBase表中的存放按照改進后Hilbert編碼的值由大到小依次排列,這樣保證了在分割region時,可以將空間位置相鄰的影像數(shù)據(jù)存儲在相同region中。因此,可以看出經(jīng)改進后的索引在HBase表中具有較高的空間臨近性。
Table 1 Image data storage model表1 影像數(shù)據(jù)存儲模型
Figure 2 Index and HBase table mapping圖2 索引與HBase表映射圖
2.2.3 過濾列族的設(shè)計
為了在檢索中過濾掉不相關(guān)的數(shù)據(jù),我們設(shè)計了過濾列族,實現(xiàn)了數(shù)據(jù)在服務(wù)器端的過濾。過濾列族中存放當前瓦片的中心經(jīng)緯度坐標,其值可由下列公式得到:
(8)
(9)
其中,(Xmin,Ymin)代表影像數(shù)據(jù)的起始經(jīng)緯度坐標;(x,y)代表該瓦片數(shù)據(jù)所在的網(wǎng)格坐標;(TileSpanX,TileSpanY)為該層影像瓦片的橫縱坐標跨度,其在HBase中存儲的邏輯視圖如表2所示。
Table 2 Design of filter family表2 過濾列族的設(shè)計
本文設(shè)計了一種基于MapReduce的影像數(shù)據(jù)寫入和查詢方法,對分層分塊處理后的影像數(shù)據(jù)進行并行處理,有效地提高了影像數(shù)據(jù)的處理效率。
MapReduce是Hadoop的開源計算框架,它遵守分治原則,通過遷移計算使每臺機器可以盡快訪問和處理數(shù)據(jù)。HBase最大的特點之一就是可以和MapReduce緊密結(jié)合,在數(shù)據(jù)的入庫處理中,我們只需要實現(xiàn)setup方法和map方法即可。其中setup方法負責初始化數(shù)據(jù)信息和共享數(shù)據(jù)信息,map方法用于將數(shù)據(jù)寫入到HBase中,其具體流程如圖3所示。
Figure 3 Parallel framework of image data storage圖3 影像數(shù)據(jù)并行入庫框架
由圖3可知,此過程中大部分操作都是在存儲瓦片數(shù)據(jù)的本地節(jié)點執(zhí)行,DataNode節(jié)點和Master節(jié)點只有少量的信息交換。具體算法偽代碼如算法1所示。
算法1影像數(shù)據(jù)的并行寫入
但是,另一種情況更可能發(fā)生,甲把乙說的話完全理解成了另一個樣子,甚至可能與原意相反。這也就導(dǎo)致另一種讓人無奈的現(xiàn)象產(chǎn)生:人們只能聽到自己想聽到的,只能看到自己想看到的。然而,模式拼接能力也不是全然無用的東西,否則我們的大腦就不會進化出這種能力了。
輸入:影像數(shù)據(jù)的所有信息。
輸出:HBase 數(shù)據(jù)表。
setup(Mapper.context){
initGridID[][] andHilbert[][]← compute(by the level);
initargs[] ←context.getConfiguration();/*通過context傳遞信息,初始化表的信息*/
}
map(key,value,context){
// 得到瓦片的行鍵
RowKey=getRowKey(key);
//將圖片轉(zhuǎn)化為BASE64編碼
ImageValue=value.toBASE64();
// 將瓦片信息存放到put中
Putput=getPut(args[],ImageValue);
// 寫入到HBase中
context.write(RowKey,put);
}
}
由于HBase將數(shù)據(jù)分別存放在不同region中,每一個region可以由一臺region server即DataNode加載。因此,我們可以使用MapReduce并行處理的方法對影像數(shù)據(jù)進行查詢。在查詢過程中,每個節(jié)點只需得到當前region中符合查詢條件的數(shù)據(jù)即可,最后通過map函數(shù)直接將數(shù)據(jù)寫入到HDFS中。
在進行區(qū)域查詢時,首先根據(jù)輸入的信息得到需要查詢的影像層。其次,根據(jù)讀取的該影像層的元數(shù)據(jù)信息得到本層瓦片的具體描述。然后,根據(jù)輸入的空間數(shù)據(jù)的查詢范圍將其映射到該層網(wǎng)格ID的數(shù)組中,從而得到網(wǎng)格范圍內(nèi)對應(yīng)的RowKey值,以便HBase檢索識別。最后,通過重新設(shè)計了MapReduce方法中Map函數(shù),對范圍內(nèi)的數(shù)據(jù)進行并行查詢,算法2如下所示。
算法2影像數(shù)據(jù)的并行區(qū)域查詢
輸入:查詢區(qū)域的經(jīng)緯度坐標(x1,y1),(x2,y2)。
輸出:該層影像查詢范圍內(nèi)的所有瓦片數(shù)據(jù)。
第一步:get the iamge level;//根據(jù)用戶輸入
第二步:GridID[x][y]← compute(the level;the metadata information);/*根據(jù)圖層號計算該層影像的網(wǎng)格信息,得到網(wǎng)格存儲的經(jīng)緯度坐標*/
第三步:BinarySearch() Calculatexandyaccording to the input query range;/*根據(jù)輸入的查詢范圍,利用二分查找,得到對應(yīng)的網(wǎng)格坐標*/
第四步:get startRowKeyand stopRowKey←Hilbert[][];/*根據(jù)該層網(wǎng)格對應(yīng)的Hilbert值,得到最大和最小的Hilbert值,并將其轉(zhuǎn)化為起始行鍵和結(jié)束行鍵*/
第五步:map(key,value){
if(fit(getFilter(value),search(x1,y1,x2,y2)))←{SingleColumnFamily( );/*根據(jù)設(shè)置的單列值過濾器,決定一行時間是否被過濾*/
key=getrowkey(value);
value=getvalue(image_value);
write(key,value);
}
}
第六步:end
實驗中選取Landsat8 8波段分辨率為15 m的3幅高分辨率影像數(shù)據(jù),經(jīng)處理后影像數(shù)據(jù)的大小分別為700 MB、1.72 GB和2.64 GB。分別對三幅影像進行數(shù)據(jù)的并行存儲與查詢實驗,以驗證本文所提方法的效率。
本實驗采用虛擬軟件XenServer6.2將3臺曙光 I450-G10塔式服務(wù)器(Intel Xeon E5-2407四核2.2 GHz處理器,8 GB內(nèi)存)虛擬成9臺主機,一臺HP Compaq dx2308(Intel Pentium E2160 1.8 GHz處理器,1 GB內(nèi)存)作為Master。每臺虛擬機裝有ZooKeeper 3.4.8版本,HBase的版本為0.98.23,Hadoop版本為2.7.2,在Cenos6.4_final(內(nèi)核2.6.32)系統(tǒng)上搭建起Hadoop的cloud cluster,HDFS總大小為450 GB。
在遙感影像數(shù)據(jù)的入庫實驗中,我們將三幅影像分層分塊后,分別在9個節(jié)點的情況下對影像進行數(shù)據(jù)入庫操作。由表3可知,當數(shù)據(jù)量增大時,每秒的寫入速率有所增加,這是因為減少了單位數(shù)據(jù)量的寫入,但是總體保持穩(wěn)定。當數(shù)據(jù)量越大時,HBase寫入數(shù)據(jù)region會發(fā)生分割操作,這是耗時的主要原因。
Table 3 Time consumption表3 遙感影像導(dǎo)入HBase 消耗時間
為了驗證不同節(jié)點個數(shù)對數(shù)據(jù)寫入效果的影響,我們分別采用不同節(jié)點對三幅影像進行入庫操作。由圖4可知,隨著節(jié)點數(shù)量的增加,數(shù)據(jù)的入庫時間縮短。數(shù)據(jù)量越大,入庫時間減少越明顯。當節(jié)點數(shù)較少時,數(shù)據(jù)導(dǎo)入時間較長,這是因為單個節(jié)點可能存儲幾個region,導(dǎo)致其負載較重,從而時間較長。image1影像由1個節(jié)點到4個節(jié)點的時間變化最為明顯,在6個節(jié)點之后,入庫時間幾乎持平。這是因為數(shù)據(jù)image1數(shù)據(jù)量較小,HBase表需要劃分的region較少。當表不再切割時,region只存在固定的幾個節(jié)點中,從而導(dǎo)致節(jié)點數(shù)量增加,但是影響寫入數(shù)據(jù)的時間變化并不明顯。
Figure 4 Data import time of different nodes圖4 不同節(jié)點數(shù)據(jù)導(dǎo)入時間
我們分別采用基于鍵值對的MapFile、MySQL集群和本文設(shè)計的基于MapReduce的HBase(簡稱MRHBase)進行對比分析。我們選擇image3影像中分辨率最大的一層作為查詢對象,分別將整幅影像占比為10%~80%作為輸入的查詢范圍,測試數(shù)據(jù)的查詢時間。由圖5可知,MRHBase在不同區(qū)域的查詢時間增長最為緩慢,MapFile增長最快。當查詢區(qū)域小于20%時,MySQL集群的查詢時間和HBase集群并行查詢時間相差不多,但是當查詢范圍增大時,MRHBase查詢時間的增長速度遠低于MySQL。其中MapFile的查詢性能最差,這是因為MapFile在讀取文件時通過調(diào)用get()方法隨機訪問文件中的數(shù)據(jù),當數(shù)據(jù)增大時查詢時間將會越來越長。由此可以發(fā)現(xiàn),數(shù)據(jù)量越大,MRHBase的效果越明顯。
Figure 5 Query time in different areas圖5 不同區(qū)域的查詢時間
為了驗證MRHBase的可擴展性,我們分別使用不同的節(jié)點對image3影像中分辨率最大的一層進行查詢,其中查詢區(qū)域包含的瓦片數(shù)量約為32 768張,大小約786.8 MB。由圖6可知,隨著節(jié)點的增加查詢時間逐漸減少,節(jié)點由1到3查詢時間呈線性減少。當節(jié)點數(shù)由3到6時,查詢時間下降速度最快。通過查看HBase表的分區(qū)可知,region的個數(shù)為6且均勻分布在不同的節(jié)點之上,所以每個節(jié)點可以同時查詢當前region下的數(shù)據(jù)。當節(jié)點繼續(xù)增加時,此時需要從已存在region的節(jié)點中讀取數(shù)據(jù),導(dǎo)致總體減少時間緩慢。
Figure 6 Query time for different node numbers圖6 不同節(jié)點個數(shù)查詢時間
本文將Hilbert曲線與網(wǎng)格索引相結(jié)合,利用HBase分布式數(shù)據(jù)庫的特點,對影像數(shù)據(jù)的存儲進行研究。通過重新設(shè)計HBase的索引和表的存儲模式,保證了影像數(shù)據(jù)的空間臨近性。實驗結(jié)果表明,與MapFile和MySQL相比,本文方法具有更好的查詢效率和可擴展性。
[1] Yang R,Ramapriyan H,Meyer C.Data access and data systems[M]∥Advanced Geoinformation Science,Boca Raton:CRC Press Inc,2010.
[2] Güting R H. An introduction to spatial database systems[J].The VLDB Journal,1994,3(4):357-399.
[3] Kothuri R K V,Ravada S,Abugov D.Quadtree and R-tree indexes in oracle spatial:A comparison using GIS data[C]∥Proc of ACM SIGMOD International Conference on Management of Data,2002:546-557.
[4] Zheng K,Fu Y.Research on vector spatial sata storage schema based on Hadoop platform[J].International Journal of Database Theory & Application,2013,6(5):85-94.
[5] Zhong Y,Sun S,Liao H,et al.A novel method to manage very large raster data on distributed key-value storage system[C]∥Proc of International Conference on Geoinformatics,2011:1-6.
[6] Chi Z,Zhang F,Du Z,et al.Cloud storage of massive remote sensing data based on distributed file system[C]∥Proc of IEEE International Conference on Signal Processing,Communication and Computing,2013:1-4.
[7] Rajak R,Raveendran D,Bh M C,et al.High resolution satellite image processing using Hadoop framework[C]∥Proc of IEEE International Conference on Cloud Computing in Emerging Markets,2015:16-21.
[8] Nishimura S,Das S,Agrawal D,et al.MD-HBase:A scalable multi-dimensional data infrastructure for location aware services[C]∥Proc of IEEE International Conference on Mobile Data Management,2011:7-16.
[9] Han D,Stroulia E.HGrid:A data model for large geospatial data sets in HBase[C]∥Proc of IEEE the 6th International Conference on Cloud Computing,2014:910-917.
[10] Zhang N,Zheng G,Chen H,et al.HBaseSpatial:A scalable spatial data storage based on HBase[C]∥Proc of International Conference on Trust,Security and Privacy in Computing and Communications,2014:644-651.
[11] Ma T,Xu X,Tang M,et al.MHBase:A distributed real-time query scheme for meteorological data based on HBase[J].Future Internet,2016,8(1):6.
[12] Xia Y,Yang X.Remote sensing image data storage and search method based on pyramid model in cloud[C]∥Proc of International Conference on Rough Sets and Knowledge Technology,2012:267-275.
[13] Wei X,Lu X,Sun H.Fast view of mass remote sensing images based-on image pyramid[C]∥Proc of International Conference on Intelligent Networks and Intelligent Systems,2008:461-464.
[14] Zhang G,Xie C,Shi L,et al.A tile-based scalable raster data management system based on HDFS[C]∥Proc of International Conference on Geoinformatics,2012:1-4.