文/俞志宏 栗國保 李少白
地理信息技術的快速發展,使其信息化水平越來越高,隨之而來的是數據的爆炸式增長,使得海量空間數據的存儲與查詢時效性面臨巨大挑戰。由于空間數據的特殊性,在存儲和管理方面也存在諸多的限制,而分布式技術的迅速發展,無疑為空間數據的存儲與管理提供了解決方法。ElasticSearch 作為一個分布式可擴展的實時搜索和分析引擎,在海量數據的存儲與搜索方面得到廣泛應用。由于ElasticSearch面向文檔的特性,使得它在海量空間數據的存儲方面也有很好的表現,但如何實現空間數據的高效查詢是業界研究的一個熱點問題。傳統的關系型數據庫大多建立樹的索引實現空間查詢,在面臨大數據量的查詢時其性能很難滿足實際需求,而傳統的空間索引很難應用于非關系型數據庫中,所以需要對空間數據進行轉換,將轉換后的數據作為索引字段以用于查詢。因此,本文依據ElasticSearch 的存儲特性,結合四叉樹網格編碼算法,將矢量數據進行轉換,并構建空間索引,以提升空間數據的查詢效率。在此基礎上,設計并實現了基于Spark 的空間數據分析的優化方案,為海量空間數據的存儲與查詢分析提供了一種快速有效的解決方案。

圖1:四叉樹網格編碼原理圖
由于四叉樹編碼算法原理較簡單且容易實現,已被廣泛應用于地理信息系統的業務處理中。該算法的基本思想是將一個已知范圍的空間劃分成四個相等的子空間,并按照此方式遞歸執行,直到樹的層次達到指定的深度或滿足某種終止條件時則停止劃分。本文依據四叉樹編碼算法的思想,實現了利用平面直角坐標系所劃分的四個象限作為編號的四叉樹編碼算法。該算法以全球矩形范圍(-180,90,180,-90)為基準網格(可根據具體應用場景調整矩形范圍),逐級四分,通過單個要素的最小外接矩形,計算落在各級網格的象限編號,將各級的象限編號按順序組合形成網格編碼,其編碼原理如圖1所示。
從圖1中可以看出該算法基于各級象限進行編碼,計算出來的編碼值能夠表達圖形在每一級的格網位置。四叉樹編碼算法的處理流程可描述為:首先,算法根據輸入的幾何對象計算該對象的最小外接矩形;其次,根據最小外接矩形的頂點坐標信息對其進行遞歸編碼;最后,輸出幾何對象的編碼集合。在使用該算法對要素類進行遞歸編碼的過程中,會存在一些線狀要素或面狀要素所跨范圍較大的情況,針對該情況算法會根據要素投射在當前級別四叉樹格網中的位置,產生相應的多個編碼值。當網格劃分到一定的級別后,單個面狀要素和線狀要素生成的編碼個數也會增加,編碼數的增多會導致存儲的冗余數據增多。因此,所采用的格網編碼的長度應根據實際數據的特點進行權衡,其遵循的原則是確保大部分圖形擁有一個編碼,允許少量的圖形擁有多個編碼。
Elasticsearch 是一個分布式、可擴展、實時的搜索與數據分析引擎,能夠為海量數據提供分布式存儲、搜索和快速分析的服務。因其強大的搜索與分析能力,已被成功用于很多海量數據的處理中,如新浪過億條的日志數據的實時分析。Elasticsearch 除能夠提供傳統數據庫很難實現的全文搜索功能外,還具備結構化搜索、數據分析及復雜的語言處理等功能。
鑒于此,本文使用Elasticsearch 存儲空間數據,以充分利用Elasticsearch 強大的索引搜索功能,達到快速查詢指定數據的效果。雖然Elasticsearch 提供的搜索功能,能夠滿足空間數據基本屬性的快速查詢,但由于圖形數據是一組坐標點的集合,直接對該字段進行索引,并不能滿足圖形數據的查詢需求。因此,本文結合空間數據的特點及Elasticsearch 索引機制,提出基于四叉樹的網格編碼算法,根據圖形數據計算其網格編碼值,使用網格編碼值對圖形數據進行索引?;谝陨显O計思想,空間數據在Elasticsearch 中的存儲形式如表1所示。表1表示的是一條空間數據在Elasticsearch 中的表示形式,在保留了空間數據原有屬性字段的基礎上添加了codes 字段,用于存儲圖形數據轉化成的編碼值集合,并指定該字段為索引字段。
針對海量空間數據存儲問題,上文中提出基于四叉樹網格編碼算法,并結合Elasticsearch 強大的搜索能力,解決了多應用場景下空間數據的查詢性能問題。但空間數據在執行空間分析操作時,計算耗時較長,尤其是參與計算的空間數據量較大時,空間分析操作需等待的時間更久,已不能滿足實際的生產需要。因此,本節在基于上文中提出的基于四叉樹網格編碼索引方案的基礎上,探討利用基于內存的分布式計算引擎Spark 解決傳統模式下計算能力不足的問題,并以空間分析中的空間裁切操作為例,驗證基于Spark 的分布式空間分析的處理性能。
上文中根據實際應用需求提出基于四叉樹網格編碼的索引方案,用以提升多場景下的空間數據查詢效率。同樣的,也可以使用該索引方案提升空間數據分布式處理的效率,即從底圖數據檢索和外部空間數據預加載兩個方面著手,來減少參與計算的數據量,從而提升分布式處理的效率。在底圖數據檢索方面,對外部空間數據使用四叉樹編碼算法計算其編碼值,并根據編碼值從Elasticsearch 中檢索出與codes 字段前綴相同的數據,從而減少Spark分發數據時的數據量;在外部空間數據預加載方面,對外部空間數據進行編碼,并建立編碼與外部要素的對應關系集合,以便在Spark 開始分布式計算時,能夠根據讀取的底圖要素的編碼值直接找到與其空間上相關的外部要素,減少程序遍歷計算的次數,從而提升空間數據分布式計算的性能。

表1:空間數據存儲結構

表2:兩種方案處理空間裁切任務耗時情況表

圖2:基于Spark 空間數據裁切處理流程圖
本節以空間裁切的應用場景為例,使用基于四叉樹網格編碼的索引方案,設計出基于Spark 的分布式空間數據處理方案。其處理流程為:
(1)程序讀取Kafka 隊列中監測圖斑數據,并調用網格編碼算法計算出矢量數據中的網格編碼值,建立網格編碼值與外部圖斑數據的映射關系,存儲于Map 集合中;
(2)Elasticsearch 根據監測圖斑編碼值集合,檢索出符合要求的底圖數據,并轉換成RDD,Spark 逐條讀取RDD 中的codes 字段的值,而后根據該編碼值從Map 集合中查找到與其有關聯的監測圖斑,分別執行空間裁切操作;
(3)輸出空間裁切后的相關數據?;赟park 空間數據裁切處理流程圖如圖2所示。
本小節通過實驗來測試本文提出的基于四叉樹網格編碼算法的空間數據存儲與分析方案在執行效率上是否優于傳統的空間數據存儲與分析方案?;贖adoop 2.7.3 搭建一個主節點,兩個數據節點的Hadoop 集群環境,并在該集群中部署Spark、Elasticsearch 環境,其中Spark 版本為2.3.0,Elasticsearch 版本為6.4.0。每個數據節點的配置信息為:1 顆8 核主頻1.70GHz 的CPU、125G 內存、操作系統為CentOS7.3。測試數據使用了一個市的地類圖斑數據集作為底圖數據,其數據量為10 萬條記錄,并按照本文提出的存儲方案,存儲于Elasticsearch 中。
為驗證本文提出的空間數據處理方案的計算性能,所以本小節中設計了基于網格編碼索引的分布式處理方案與傳統的基于隨機散列的分布式處理方案的對比試驗。為保證試驗結果的可比性,底圖數據固定為一個市的地類圖斑數據,使用不同數據量的監測圖斑對兩種方案進行測試。兩種方案處理空間裁切任務的耗時情況如表2所示,其中基于隨機散列的分布式處理方案記作R-INDEX,基于網格編碼索引的分布式處理方案記作G-INDEX,花費時間單位為毫秒。
從表中耗時情況可分析出當選取的監測圖斑逐漸增加時,兩套方案的處理時間都有所增加,但本文提出的G-INDEX 方案,在做空間數據裁切操作時所花費的時間明顯低于R-INDEX 方案所花費的時間,這表明本文提出基于四叉樹網格編碼空間索引方案要優于傳統的基于隨機散列的處理方案。這是因為基于網格編碼的空間索引方案,在獲取到監測圖斑后能夠根據生成的編碼值,從Elasticsearch 中快速檢索出與監測圖斑數據相關的記錄,減少空間裁切操作時所處理的數據量,從而提升空間裁切處理效率。
本文在研究了Elasticsearch 基礎上,根據矢量數據的空間特性,提出基于四叉樹網格編碼索引方案;而后依據Spark 的分布式處理原理,設計出基于Spark 的空間數據處理優化方案,并選取空間裁切作為應用場景,驗證了該優化方案的有效性。