一種海量遙感影像元數(shù)據(jù)分布式存儲(chǔ)方法及并行查詢方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明屬于海量遙感影像元數(shù)據(jù)查詢領(lǐng)域,適用于海量遙感影像元數(shù)據(jù)的分布式 存儲(chǔ)和分布式并行查詢。具體涉及一種基于HDFS存儲(chǔ)、Spark分布式并行計(jì)算、Redis內(nèi)存緩 存的海量遙感影像元數(shù)據(jù)并行空間索引構(gòu)建和分布式并行查詢方法。
【背景技術(shù)】
[0002] 隨著遙感影像元數(shù)據(jù)的不斷積累,傳統(tǒng)的空間數(shù)據(jù)庫已不能滿足對(duì)數(shù)據(jù)增長的存 儲(chǔ)和查詢。大數(shù)據(jù)技術(shù)的出現(xiàn),海量遙感影像元數(shù)據(jù)的存儲(chǔ)、查詢、分析成為了可能??臻g數(shù) 據(jù)庫是通過空間索引技術(shù)提高查詢效率,常用的索引技術(shù)有網(wǎng)格、KD樹、四叉樹、R樹以及它 們的變形。國內(nèi)外空間數(shù)據(jù)庫廠商一般采用四叉樹和R -樹的索引方法,如國外的Arc Vi ew、 GeoSpatialDataBlade均采用R樹系列的空間索引技術(shù),國內(nèi)的MapGis和SuperMap均采用四 叉樹作為空間索引,Oracle公司的Spatial Ware采用了四叉樹和R樹結(jié)合的索引方法。
[0003] 單機(jī)的文件系統(tǒng)不能滿足大數(shù)據(jù)的存儲(chǔ)和查詢分析。隨著近幾年大數(shù)據(jù)技術(shù)的出 現(xiàn),文件系統(tǒng)得到了快速發(fā)展,出現(xiàn)了大量基于硬盤的分布式文件系統(tǒng)和基于內(nèi)存的分布 式文件系統(tǒng)。分布式文件系統(tǒng)HDFS已經(jīng)被廣泛運(yùn)用。HDFS是一個(gè)高容錯(cuò)性、高吞吐率、適合 海量數(shù)據(jù)集、能夠部署在廉價(jià)的機(jī)器上的分布式文件系統(tǒng)。
[0004] 現(xiàn)階段大數(shù)據(jù)計(jì)算框架層出不窮,Spark是UC Berkeley AMP lab所開源的類 Hadoop MapReduce的通用的并行計(jì)算框架,Spark基于map reduce算法實(shí)現(xiàn)的分布式計(jì)算, 擁有Hadoop MapReduce所具有的優(yōu)點(diǎn);但不同于MapReduce的是Job中間輸出結(jié)果和最終結(jié) 果可以保存在內(nèi)存中,從而不需要多次讀寫HDFS,因此Spark能更好地適用于數(shù)據(jù)挖掘與機(jī) 器學(xué)習(xí)等需要迭代的map reduce的算法。本發(fā)明的分區(qū)是基于樹的構(gòu)建,構(gòu)建過程是遞歸 迭代的過程。在樹上查詢也是基于內(nèi)存,Spark能夠?qū)?shù)據(jù)緩存到內(nèi)存?;谝陨蟽?yōu)點(diǎn),本發(fā) 明的實(shí)施階段采用Spark框架實(shí)現(xiàn)。
【發(fā)明內(nèi)容】
[0005] 針對(duì)遙感影像元數(shù)據(jù)具有數(shù)據(jù)量大、計(jì)算復(fù)雜度高等特點(diǎn),提出了一種海量遙感 影像元數(shù)據(jù)分布式存儲(chǔ)方法及并行查詢方法。本方法對(duì)遙感影像元數(shù)據(jù)進(jìn)行均勻地理分 區(qū),對(duì)分區(qū)后的數(shù)據(jù)進(jìn)行分布式并行查詢的解決方案。
[0006] 均勾地理分區(qū)是指在大數(shù)據(jù)框架Spark下,根據(jù)現(xiàn)有的KD-Tree算法發(fā)明了DKD-Tree算法。首先根據(jù)DKD-Tree算法對(duì)遙感影像元數(shù)據(jù)構(gòu)建索引樹。其次在構(gòu)建DKD-Tree的 過程中,將DKD-Tree索引子樹序列化并分散存儲(chǔ)在分布式文件系統(tǒng)HDFS的各個(gè)機(jī)器節(jié)點(diǎn) 上。最后將DKD-Tree葉子節(jié)點(diǎn)上的數(shù)據(jù)以一個(gè)數(shù)據(jù)分區(qū)保存到HDFS中。在對(duì)數(shù)據(jù)分區(qū)的時(shí) 候,根據(jù)DKD-Tree葉子節(jié)點(diǎn)數(shù)據(jù)條數(shù)閾值保證每個(gè)分區(qū)中數(shù)據(jù)量能夠使得Spark單個(gè)Task 快速計(jì)算。原始的KD-Tree算法只能對(duì)空間點(diǎn)數(shù)據(jù)(例如坐標(biāo)數(shù)據(jù))構(gòu)建空間索引,DKD-Tree 算法可以對(duì)空間面數(shù)據(jù)(例如多邊形)構(gòu)建空間索引,其次原始的KD-Tree算法不能在分布 式下并行構(gòu)建索引。
[0007] 海量數(shù)據(jù)查詢是指利用Spark分布式并行計(jì)算能力,對(duì)遙感影像元數(shù)據(jù)在DKD-Tree上進(jìn)行分布式并行分區(qū)查詢。將查詢到的分區(qū)在Spark集群節(jié)點(diǎn)上進(jìn)行并行計(jì)算,最后 將所有機(jī)器上的查詢結(jié)果匯總,然后緩存到Redis內(nèi)存數(shù)據(jù)庫中。
[0008] 數(shù)據(jù)分區(qū)和數(shù)據(jù)查詢的具體步驟如下:
[0009] (a)海量遙感影像元數(shù)據(jù)分區(qū):
[0010] 1.將原始未分區(qū)的海量遙感影像元數(shù)據(jù)存儲(chǔ)到分布式文件系統(tǒng)HDFS中。
[0011] 2.根據(jù)屬性進(jìn)行屬性(例如遙感影像元數(shù)據(jù)產(chǎn)生的時(shí)間,遙感影像元數(shù)據(jù)的文件 大小,遙感影像元數(shù)據(jù)的地理區(qū)域[例如中國、美國等]等)分區(qū),并冗余存儲(chǔ)到HDFS。優(yōu)化針 對(duì)不同屬性條件進(jìn)行快速查詢。
[0012] 3.利用DKD-Tree算法對(duì)每個(gè)屬性分區(qū)后的數(shù)據(jù)再分別進(jìn)行均勻地理范圍(地理范 圍指遙感影像元數(shù)據(jù)的經(jīng)煒度范圍)分區(qū)。
[0013] (1)參看圖1,首先讀取所有遙感影像元數(shù)據(jù),計(jì)算最大經(jīng)度和最大煒度的均值和 方差、數(shù)據(jù)總條數(shù)N、最小邊界矩陣MBR(Minimum Bounding Rectangle)。構(gòu)建DKD-Tree根節(jié) 點(diǎn)。將根節(jié)點(diǎn)保存到隊(duì)列中。從隊(duì)列中彈出一個(gè)節(jié)點(diǎn)標(biāo)記為當(dāng)前節(jié)點(diǎn)。
[00?4] 計(jì)算最小邊界矩陣MBR:計(jì)算每條元數(shù)據(jù)的最小經(jīng)度minLon,最大經(jīng)度maxLon,最 小煒度minLax,最大煒度minLax。
[0015]計(jì)算煒度(經(jīng)度)的均值公式:
[0017] 計(jì)算煒度(經(jīng)度)的方差公式:
[0018]
[0019] (2)判斷如果當(dāng)前節(jié)點(diǎn)數(shù)據(jù)條數(shù)小于最小數(shù)據(jù)條數(shù)閾值,則當(dāng)前節(jié)點(diǎn)不再分裂。將 當(dāng)前節(jié)點(diǎn)標(biāo)記為葉子節(jié)點(diǎn),并分配唯一的ID標(biāo)識(shí)。
[0020] (3)判斷如果當(dāng)前樹深度大于樹深度閾值則將當(dāng)前樹序列化并保存到HDFS。將當(dāng) 前樹的每個(gè)葉子節(jié)點(diǎn)中的數(shù)據(jù)保存到HDFS。(將葉子節(jié)點(diǎn)ID作為文件夾名稱,將葉子節(jié)點(diǎn)中 數(shù)據(jù)保存到文件夾中。)
[0021] (4)如果當(dāng)前節(jié)點(diǎn)數(shù)據(jù)條數(shù)小于等于最小數(shù)據(jù)條數(shù)閾值。選擇方差最大的維度(經(jīng) 度或者煒度)進(jìn)行數(shù)據(jù)劃分。計(jì)算數(shù)據(jù)條目的中位數(shù)。(中位數(shù):例如方差最大維是經(jīng)度。1. 首先對(duì)所有數(shù)據(jù)按照最大經(jīng)度maxLon排序。2.求出最大經(jīng)度的中位數(shù)。)
[0022] 方差最大維(經(jīng)度或者煒度):Maxdim=rnax(VarmaxLat,VarmaxL〇n)
[0023] (5)根據(jù)(4)中計(jì)算的中位數(shù)將數(shù)據(jù)分為三個(gè)分支。①.最大邊界(如果最大維為經(jīng) 度,最大邊界指最大經(jīng)度maxLon)小于中位數(shù)的影像數(shù)據(jù)。②最小邊界(如果最大維為經(jīng)度, 最小邊界指最小經(jīng)度minLon)大于中位數(shù)的影像數(shù)據(jù)。③數(shù)據(jù)在①和②之外的其他數(shù)據(jù)。 [0024] (b)海量遙感影像元數(shù)據(jù)查詢:
[0025] 1.針對(duì)遙感影像元數(shù)據(jù)進(jìn)行分區(qū)并行查詢。
[0026] (1)參看圖2,將(a)中構(gòu)建的所有的DKD-Tree緩存到集群各個(gè)節(jié)點(diǎn)的內(nèi)存中。
[0027] (2)將查詢條件(例如查詢多邊形polygon)在對(duì)應(yīng)DKD-Tree樹上進(jìn)行查詢,查詢數(shù) 據(jù)所在分區(qū)。比如說查詢條件中帶有時(shí)間條件(2013-2015年),DKD-Tree按照年份構(gòu)建的 樹,比如2013年構(gòu)建多顆DKD-Tree,2014年構(gòu)建多顆DKD-Tree,2015年構(gòu)建多顆DKD-Tree; 那么對(duì)應(yīng)的DKD-Tree即指根據(jù)2013、2014、2015年份構(gòu)建的所有DKD-Tree 〇
[0028] ①對(duì)于完全覆蓋(查詢多邊形完全包含DKD-Tree節(jié)點(diǎn)的MBR)DKD-Tree的節(jié)點(diǎn)的查 詢,如果當(dāng)前節(jié)點(diǎn)是葉子節(jié)點(diǎn),返回(葉子節(jié)點(diǎn)ID,數(shù)據(jù)條數(shù)count)。如果不是葉子節(jié)點(diǎn),將 該節(jié)點(diǎn)下的所有葉子節(jié)點(diǎn)都返回(葉子節(jié)點(diǎn)ID,數(shù)據(jù)條數(shù)count)。
[0029] ②對(duì)部分覆蓋(查詢多邊形與DKD-Tree節(jié)點(diǎn)的MBR相交)的葉子節(jié)點(diǎn),返回葉子節(jié) 點(diǎn)ID。
[0030] (3)在遙感影像元數(shù)據(jù)中查詢。(對(duì)于(2)中完全覆蓋的數(shù)據(jù)都滿足條件,因此不用 在遙感影像元數(shù)據(jù)中查詢)。
[0031] ①從HDFS中讀取(2)所有部分覆蓋分區(qū)(每個(gè)葉子節(jié)點(diǎn)中的數(shù)據(jù)保存到HDFS,即為 一個(gè)分區(qū))下的數(shù)據(jù)M。
[0032]②利用Spark計(jì)算查詢多邊形與每個(gè)分區(qū)下遙感影像元數(shù)據(jù)是否相交。
[0033]③最后對(duì)每個(gè)分區(qū)的遙感影像元數(shù)據(jù)相交條數(shù)進(jìn)行累加。
[0034]④返回分區(qū)(區(qū)號(hào)等于葉子節(jié)點(diǎn)ID)和該分區(qū)下相交條數(shù)(葉子節(jié)點(diǎn)ID,數(shù)據(jù)條數(shù) count)〇
[0035] (4)將完全覆蓋的查詢結(jié)果和部分覆蓋查詢結(jié)果匯總。匯總結(jié)果為一個(gè)數(shù)組 result。數(shù)組格式為[(leftIDl,countl ),( leftID2,count2),......] 〇
[0036] (5)將匯總結(jié)果按照葉子節(jié)點(diǎn)ID排序。
[0037] (6)將排序后的結(jié)果緩存到內(nèi)存數(shù)據(jù)庫Redis中,保存格式為(查詢多邊形, result)〇
[0038] 2.針對(duì)分頁查詢返回結(jié)果。
[0039] (1)根據(jù)每次查詢條件(例如查詢多邊形和頁碼[polygon,pageNum]),首先根據(jù)查 詢多邊形polygon從Redis中讀取緩存結(jié)果。
[0040] (2)根據(jù)當(dāng)前頁號(hào)pageNum、每頁數(shù)據(jù)條數(shù)pageSize和1中(4)得到的緩存結(jié)果 result,計(jì)算數(shù)據(jù)所在分區(qū)。
[0041] ①計(jì)算最小分區(qū)。
[0042] 卩&1"1:10]\1;[11 = 111;[11(?),其中?滿足((3011111:1+(301111七2 + ."+(301111七?)/卩&區(qū)63126> pageNum。
[0043] ②計(jì)算最大分區(qū)。
[0044] partIDMax = min(Q),其中Q滿足(countl+count2+."+countQ)/pageSize> = (pageNum+1)〇
[0045] ③當(dāng)前頁數(shù)據(jù)所在分區(qū)為(Ρ,Ρ+1,Ρ+2,……,〇-2,〇_1,〇),其中?和〇都是正整數(shù)且 P〈 = Q,(P+l,P+2,……,Q-2,Q-1)分區(qū)中所有滿足多邊形相交的數(shù)據(jù)都要返回。在P分區(qū)中 只需要返回最后R條數(shù)據(jù)Pr,在Q中只需要返回前T條數(shù)據(jù)Qt。
[0046]④P中的最后R條數(shù)據(jù)Pr。
[0047] Pr=(countl+count2+."+countP)-pageSize*(pageNum-1)〇
[0048] ⑤Q中前T條數(shù)據(jù)Qt。
[0049] Qt = pageSize氺pageNum-(countl+count2+--.+countQ-2+countQ-l) 〇
[0050] (3)并行查詢當(dāng)前頁數(shù)據(jù)。
[0051]①計(jì)算當(dāng)前頁數(shù)據(jù)在每個(gè)分區(qū)下的數(shù)據(jù)范圍。根據(jù)(2)中的計(jì)算結(jié)果可知,(Ρ,Ρ+ 1,Ρ + 2,......,0_2,(>)-1,(>))分區(qū)下的數(shù)據(jù)范圍為[(?1',(30111^?),(0,(30111^? + 1),(0, countP+2),......,(0,countQ-2),(0,countQ-1),(Qt,countQ)]。
[0052]②并行計(jì)算每個(gè)分區(qū)下數(shù)據(jù)。(如果當(dāng)前分區(qū)是完全覆蓋,同樣不需要重新計(jì)算, 直接返回即可)。
[0053] I.從HDFS中讀取每個(gè)分區(qū)數(shù)據(jù)。
[0054] Π .對(duì)查詢多邊形與每個(gè)分區(qū)中的數(shù)據(jù)計(jì)算是否相交。
[0055] m.分別收集每個(gè)分區(qū)中相交數(shù)據(jù)。
[0056] IV.對(duì)每個(gè)分區(qū)中的相交數(shù)據(jù)按照遙感影像元數(shù)據(jù)的編號(hào)進(jìn)行排序。
[0057] V ·根據(jù)每個(gè)分區(qū)的數(shù)據(jù)范圍[(Pr,countP),(0,countP+i),(0,countP+2),......, (0,countQ-2),(0,countQ-l),(Qt,countQ)],返回每個(gè)分區(qū)下滿足當(dāng)前頁的數(shù)據(jù)。
[0058] VI.對(duì)V中所有返回的數(shù)據(jù)進(jìn)行匯總。
[0059] 與現(xiàn)有技術(shù)相比,本發(fā)明的積極效果如下:
[0060] 在傳統(tǒng)地理空間數(shù)據(jù)庫中,對(duì)遙感影像元數(shù)據(jù)構(gòu)建索引并查詢,如果數(shù)據(jù)超過2G, 覆蓋數(shù)據(jù)條數(shù)超過800萬條,每次查詢接近30秒。利用數(shù)據(jù)庫可編程性受到了限制,只能通 過SQL、數(shù)據(jù)庫函數(shù)等進(jìn)行查