文/彭旭
隨著數據采集設備的井噴式增長,對海量的采集數據進行處理的需求日益增長,大數據技術為海量數據處理提供了合適的解決方案。從Hadoop 的MapReduce 到Spark 內存計算,大數據計算的性能得到了很大的提高。而GIS 行業的關注重點則是帶有位置信息的時空大數據的計算處理,時空大數據是最重要的大數據之一,它的價值在于時間、空間、對象之間的關聯關系,對時空大數據的處理、分析和挖掘是建設智慧城市必不可少的一環。主流的大數據框架如Hadoop、Spark 等并不支持空間計算,GeoSpark 在Spark 的基礎上提供了空間大數據計算能力的支持。本文主要研究基于GeoSpark 的空間大數據計算優化問題。
Spark 是一個基于內存計算的支持大規模數據處理的統一分析引擎,由Spark Core 核心模塊以及在核心模塊上針對不同應用場景分別構建的Spark SQL、Spark Streaming、MLlib、GraphX 四個模塊構成,分別用于支持SQL 交互查詢、實時數據流處理、機器學習和圖計算。其中Spark Core 提供了分布式任務調度和I/O功能,其基礎的程序抽象稱為彈性分布式數據集(Resilient Distributed Dataset,RDD),是一個可以并行操作、支持容錯的數據結構。
Spark 本身不支持空間數據結構和空間計算,GeoSpark 在Spark 的基礎上對空間大數據計算的功能進行了擴展。其實現架構主要分為兩層,分別是空間數據結構層和空間查詢處理層。
空間數據結構層的內容包括基本的分布式空間數據結構、空間數據分區以及各個分區內構建局部空間索引等內容。其中對于分布式空間數據結構,GeoSpark 通過結合Spark RDD 和JTS 工具,提供了Spatial RDD 這一具體實現方案,支持點、線、面、圓等空間數據結構;對于空間數據分區,GeoSpark 支持規則格網、R 樹、四叉樹等分區方式,通過對空間數據按照空間近鄰的方式劃分分區,在單個分區內進行空間比較計算,來實現Filter And Refine 模型以提高查詢計算的效率;在各個分區內,GeoSpark 還支持R 樹、四叉樹兩種類型的空間索引,提高空間比較運算的執行效率。
空間查詢處理層的內容包括標準的空間查詢SQL 和SpatialRDD 的API。SQL 語法支持空間對象的構造函數、空間計算函數和空間關系推斷函數如包含、相交等。
JTS(Java Topology Suite)工具是一個用Java 語言開發的支持拓撲幾何計算的開源軟件庫,GeoSpark 的空間計算部分的功能均基于JTS 提供的API 進行實現。其中,在實現空間相交運算時,GeoSpark 通過JTS 的Geometry API 來判斷兩個空間對象是否相交。但對于批量空間相交運算,即判斷一個目標空間對象與一批待匹配空間對象的相交比較運算,考慮到目標空間對象在計算過程中的不變性,包括索引在內的許多中間數據被大量的重復計算,造成了計算性能的浪費。JTS 提供的PreparedGeometry API 對中間數據進行緩存,避免了重復計算,在實際情景中計算性能的提升能達到40 倍。本文基于JTS 提供的PreparedGeometry 的API,重寫了GeoSpark的空間相交運算,并與GeoSpark 原生的實現方式進行對比,發現計算效率有顯著的提升。
本文實驗采用的計算模型為計算城市出租車最常行駛的道路,具體計算邏輯為將生成緩沖區后的道路數據與軌跡點數據做空間相交運算并統計與每條道路相交的軌跡點位的總數量,按照軌跡點位數量對道路數據進行排序,從而得到行駛車輛最多的道路。
實驗中的Spark 應用程序運行在由四臺服務器構建的集群上,幾臺服務器在同一個局域網內。實驗使用的Hadoop 版本是2.7.3,Spark 版本是2.2.0,GeoSpark 的版本是1.0.1。
參與計算的數據量大小分別是一億條軌跡點位數據和1437 條道路數據,平均每條軌跡點數據大小為23 個字節(Spark 只讀取參與計算的字段)。Spark 應用程序分配的資源為:4 個Executor,每個Executor 分配了8 核8GB內存,Driver 分配了4 核1GB 內存,分區數設置為1000。
實驗結果為使用Geometry API 執行時間為2048 秒,而使用PreparedGeometry API執行時間只需要319 秒。可以看出,相比基于Geometry API 進行空間相交計算,基于PreparedGeometry API 的計算效率有顯著的提升。
大數據技術已經越來越廣泛的應用到各個行業當中,時空大數據則是GIS 行業與大數據技術結合的重要研究方向。GeoSpark 在Spark 的基礎上提供了對空間大數據進行處理計算的支持,本文則對GeoSpark 空間計算的性能優化進行了研究。未來大數據技術還將進一步發展,如何擴展大數據計算的應用領域、提高數據計算處理的能力還需要更進一步的研究。