一、概述
GeoMesa是由locationtech開源的一套地理大資料處理工具套件。定位是一個基於分散式資料庫的海量空間資料處理的資料引擎(SDE),可在分散式計算系統上進行大規模的地理空間查詢和分析。使用GeoMesa開源幫助使用者管理、使用來自於物聯網、社交媒體、手機應用的海量的時空(spatio-temporal)資料。
GeoMesa基於已有的GIS開源框架GeoTools,可以進行地理學方面的空間資料的處理,同時,GeoMesa也支援比較成熟的大資料框架進行資料的處理,儲存和計算,此外GeoMesa本身還有其特有的時空索引的機制,尤其是對LineString,Polygon等要素提供的XZ索引機制,為時空資料在大資料場景中進行運用提供了很好的拓展。
GeoMesa體系架構
GeoMesa是在HBase,Accumulo,Cassandra,Google BigTbale,Kafka和Spark上提供對時空資料的儲存,索引,查詢並且轉換。支援將海量的時空資料儲存到Accumulo,HBase,Google Bigtable和Cassandra資料庫中,對點,線,面的時空索引,並提供高效的索引來讀取、查詢這些資料。並支援通過指定空間條件(距離和範圍)來快速查詢。另外GeoMesa還基於Apache Kafka對時空資料進行分層語義,提供了時空資料的近實時流處理功能。
場景一:GeoMesa 允許使用儲存在GeoMesa中的資料,其他GeoTools資料儲存中的資料在Spark上執行作業。GeoMesa執行建立Spark RDD和資料幀,將Spark RDD和資料幀寫入地理工具資料儲存,並使用Kryo 進行序列化。GeoMesa底層為geomesa-spark-jts模組,geomesa-spark-core模組是spark core的擴充套件,支援geotools的query,生成序列化好的simply feature型別的RDD。
場景二:GeoMesa的定位是一個時空資料引擎,或者叫資料庫中介軟體,目的在於使使用者可以在分散式NoSql資料庫中 儲存和管理海量空間資料.
場景三:GeoMesa作為空間大資料處理框架,本身不儲存資料,資料儲存依賴底層的分散式資料庫,如HBase,Accumulo等。
場景四:GeoMesa通過和GIS Server(GeoServer)的整合, GeoMesa 提供了通過標準OGC介面(WMS/WFS)訪問資料的能力,通過這些介面,使用者可以方便對GeoMesa處理的資料進行展示和分析,比如查詢、直方圖、時間序列分析等。
二、整體能力1、 儲存千兆位元組到PB的空間資料(上百億個點或更多)
2、 秒級提供 千萬點獲取
3、 單節點秒級接受資料資料 超過10 000條記錄
4、 輕鬆水平擴充套件
5、支援Spark進行自定義分散式地理空間分析
6、支援OGC客戶端驅動地圖。實現GeoTools介面,提供了使用OGC標準服務介面資料訪問能力。通過OGC的API 和協議(WFS,WMS,WPS,WCS)進行整合。
三、為什麼選擇GeoMesa能夠儲存和處理海量時空資料
支援實時性強、需要快速讀寫的資料
支援spark分析
支援水平擴充套件
通過GISServer提供地圖服務,並支援Common Query Language (CQL)
四、模組及概念1、 GeoMesa相關概念
GeoMesaDataStore 在進行資料表建立,資料匯入,資料查詢等操作都會通過GeoMesaIndexManager類獲取空間索引,然後針對每個空間要素都會生成一個索引值作鍵值。
ShapefileIndest是Geomesa中匯入shapefile檔案
2、GeoMesa索引
GeoMesa預設會為geometry 和date 建立幾種索引。GeoMesaIndexManager,日期型別屬性既可以作為時空索引,也可以單獨的作為屬性索引。GeoMesa會預設為時間和空間建立索引,也可以自己指定索引
空間索引 (Z2/XZ2) Spatial Index 簡單要型別包含幾何型別屬性(點,線,面)
時空索引(Z3/XZ3)Spatio-Temporal Index 簡單要素型別不僅包含幾何型別屬性,還包含日期屬性
z2/xz2/ Point的空間索引和時空索引, 欄位名:Geometry
z3/xz3/ LineString和Polygon的空間索引和時空索引,欄位名:Geometry 和 Date
id/ 根據featureID 構建索引
attr 根據屬性值構建索引
Z2 [z2] - Z2索引使用二維Z階曲線來索引點資料的緯度和經度。如果要素型別具有幾何型別,則將建立此索引 Point。這用於有效地回答具有空間元件但沒有時間元件的查詢。
Z3 [z3] - Z3索引使用三維Z階曲線來索引點資料的緯度,經度和時間。如果要素型別具有幾何型別Point且具有時間屬性,則將建立此索引。這用於有效地回答具有空間和時間元件的查詢。
XZ2 [xz2] - XZ2索引使用XZ-ordering [1]的二維實現來索引非點資料的緯度和經度。XZ排序是Z-排序的擴充套件,設計用於空間擴充套件物件(即非點幾何,如線串或多邊形)。如果要素型別具有非Point幾何圖形,則將建立此索引。這用於有效地回答具有空間元件但沒有時間元件的查詢。
XZ3 [xz3] - XZ3索引使用XZ-ordering [1]的三維實現來索引非點資料的緯度,經度和時間。如果要素型別具有非Point幾何並且具有時間屬性,則將建立此索引。這用於有效地回答具有空間和時間元件的查詢。
Record / ID [ id] - 記錄索引使用功能ID作為主鍵。它用於ID的任何查詢。此外,某些屬性查詢可能最終從記錄索引中檢索資料。
Attribute [ attr] - 屬性索引使用屬性值作為主索引鍵。這允許在沒有時空元件的情況下快速檢索查詢。屬性索引包括輔助時空金鑰,其可以改進具有多個謂詞的查詢。
3、時空資料
索引:Geohash + 日期時間字串
查詢:查詢計劃實際上是一個位於所需地理區域和時間間隔內的連續單元格範圍的列表
如: -180≤經度<45 , -90≤緯度<22.5 ,0 <time <9
4、API
GeoMesaIndex<DomainObject> //空間索引AccumuloGeoMesaIndex GeoMesaQuery \t\t\t\t//空間查詢DomainObject五、輸入能力 GeoMesa Convert 配置擴充套件庫,從GeoTools庫 轉換 SimpleFeature 到 GeoMesa中,該工具可以通過定義JSON檔案進行資料匯入,免寫程式碼
支援的資料型別:
JSON / XML /
ShapeFile/
JDBC /
分隔文字(CSV,EXCEL,MYSQL) /
Avro /Fixed Width Text
六、儲存能力根據儲存介質,資料形態及分析需求 可以把資料分為:分散式NoSQL儲存,實時流儲存,分散式檔案系統 ,混合儲存和 其他。
1、 分散式NoSQL儲存
分散式NoSQL儲存主要用於大規模空間資料,對計算效能有要求。
HBase 支援分散式,用的最廣泛
Accumulo 支援分散式,支援高階安全功能
Cassandra 用的最廣泛
2、 實時流儲存
實時流儲存主要用於流式資料儲存,主要用於實時計算。
Kafka
Redis
3 分散式檔案系統儲存
對空間分析和實時性要求不高,可以考慮分散式檔案系統儲存。
FileSystem(Hadoop HDFS,AWS S3,Google FileStorage, Azure BlobStore, Local disk)
支援讀取各種現有資料,沒有資料庫不高效
4 混合儲存
混合儲存(Merged Data Store View),GeoMesa支援通過單個圖層查詢多個數據儲存。例如: 最新資料用 HBase 儲存, 老舊資料用 HDFS 儲存。
Json格式:以Accumulo 與 PostGis 儲存為例
{ "stores": [ { "accumulo.zookeepers": "localhost", "accumulo.instance.id": "test", "accumulo.catalog": "test", "accumulo.user": "test", "accumulo.password": "test" }, { "dbtype": "postgis", "host": "localhost", "port": "5432", "database": "test", "user": "test", "passwd": "test" } ]}混合儲存相關類:
geomesa.merged.loader geomesa.merged.stores geomesa.merged.store.filter org.locationtech.geomesa.index.view.MergedViewConfigLoader5 其他儲存
Google Bigtable 、Kudu、Lambda、NiFi、BlobStore: 具有時空索引的二進位制大資料。
七、GeoMesa SparkGeoMesaSpark 允許在Apache Spark 對儲存在GeoMesa上的資料, GeoTools支援的 資料儲存資料執行Jobs。GeoMesaSpark允許建立 Spark RDD 和 DataFrame ,寫Spark RDD 和 DataFrame 到 GeoMesa Accumulo 或者其他 GeoTools DataStore 的資料中。
GeoMesa Spark 提供了 對 Spark的 不同層級支援
geomesa-spark-jts 處於底層,包含使用者定義的空間型別及函式,該模組只依賴在 JTS 庫上,其他見 Spart JTS。
geomesa-spark-core 該模組通過GeoTools Query 作為輸入,生成 RDD s,包含SimpleFeature。後端支援不同的資料儲存。包括HBase,Accumulo,FileSystem,Kudu 以及 GeoTools支援的資料儲存,其他見 Spark Core。
geomesa-spark-sql 處在頂層,用於在 RDDs 與 DataFrame s 轉換,其他間 Spark SQL。
1、 Spark JTS
Spark JTS提供了一組使用者定義函式(UDFs)和使用者定義型別(UDTs),這些函式執行在spark中執行SQL查詢,從而對地理空間資料型別執行空間操作。支援基於Spark Sql模組中存在的資料集/資料幀API,以提供地理空間功能,包括自定義地理空間資料型別和函式,從地理弓箭資料儲存建立資料幀的能力及改進SQL查詢效能的優化。SparkSession
(1). 空間使用者定義型別 UDT 包含:
GeometryUDT,PointUDT,LineStringUDT,PolygonUDT,MultiPointUDT,MultiLineStringUDT,MultiPolygonUDT,GeometryCollectionUDT (2). 空間使用者定義函式UDF包含:
幾何構造:
st_box2DFromGeoHash,st_geomFromGeohash,st_geomFromText,st_geomFromWKT,st_geomFromWKB,st_geometryFromText,st_lineFromText,st_mLineFromText,st_mPolyFromText,st_makeBBOX,st_makeBox2D,st_makeLine,st_makePoint,st_makePointM,st_makePolygon,st_point,st_pointFromGeoHash,st_pointFromText,st_pointFromWKB,st_polygon,st_polygonFromText 幾何訪問:
st_boundary,st_coordDim,st_dimension,st_envelope,st_exteriorRing,st_geometryNst_interiorRingN,st_isClosed,st_isCollection,st_isEmpty,st_isRingst_isSimple,st_isValid,st_numGeometries,st_numPoints,st_pointN,st_x,st_y 幾何型別轉換:
st_castToLineString,st_castToPoint,st_castToPolygon,st_castToGeometry,st_byteArray 幾何編輯:
st_translate 幾何輸出:
st_asBinary,st_asgeoJSON,st_asLatLonText,st_asText,st_geoHash 空間關係:
st_area,st_centroid,st_closestPoint,st_contains,st_covers,st_crosses,st_disjoint,st_distance,st_distanceSphere,st_distanceSpheroid,st_equals,st_intersects,st_length,st_lenthSphere,st_lengthSpheroid,st_overlaps,st_relate,st_relateBool,st_touches,st_winthin 幾何處理:
st_bufferPoint,st_convexHull,st_idlSageGeom`2、Spark Core
GeoMesa Spark Core 是直接處理geomesa 和其他地理空間資料儲存中的特徵RDD。geometry-spark-core被直接用RDDs 處理儲存在GeoMesa 的要素。
其主要包含兩部分,空間索引GeoMesaFeatureIndex 與資料儲存GeoMesaDataStore。
空間索引主要是GeoMesa中定義的Z2/Z3,XZ2/XZ3的實現,用於將時空資料轉換為可被列資料庫儲存一維鍵值形式,DataStore是基於GeoTools資料介面實現的用於資料訪問的標準介面.
GeoMesaSpark、SparkConf
SpaceialRDDProvider 提供了用於訪問Spark中地理空間資料的API
介面為 :SpatialRDDProvider
val conf = new SparkConf().setMaster("local[*]").setAppName("testSpark")val sc = SparkContext.getOrCreate(conf)// create RDD with a geospatial query using GeoMesa functionsval spatialRDDProvider = GeoMesaSpark(dsParams)val filter = ECQL.toFilter("CONTAINS(POLYGON((0 0, 0 90, 90 90, 90 0, 0 0)), geom)")val query = new Query("chicago", filter)val resultRDD = spatialRDDProvider.rdd(new Configuration, sc, dsParams, query)3、 Spatial RDD Providers
GeoSpark 支援的資料儲存:Accumulo,HBase,FileSystem,GeoTools等。
Spark 中最基本的資料抽象是 RDD(彈性分散式資料集 / Resilient Distributed DataSet)。
Accumulo RDD -> AccumuloApatialRDD
HBase RDD -> HBaseSpatialARDDProvider
FileSystem RDD -> FileSystemRDDProvider (預設的)
Converter RDD -> ConvertersPatialRDDProvider
GeoTools RDD -> GeotoolsSpatialRDDProvider
Accumulo : AccumuloDataStore , AccumuloSpatialRDDProvider
val params = Map( "accumulo.instance.id" -> "mycloud", "accumulo.user" -> "user", "accumulo.password" -> "password", "accumulo.zookeepers" -> "zoo1,zoo2,zoo3", "accumulo.catalog" -> "geomesa")val query = new Query("gdelt")val rdd = GeoMesaSpark(params).rdd(new Configuration(), sc, params, query)HBase : HBaseSpatialRDDProvider HBaseDataStore
val params = Map("hbase.zookeepers" -> "zoo1,zoo2,zoo3", "hbase.catalog" -> "geomesa")val query = new Query("gdelt")val rdd = GeoMesaSpark(params).rdd(new Configuration(), sc, params, query)FileSystem: FileSystemRDDProvider FileSystemDataStore
val params = Map("fs.path" -> "s3a://mybucket/geomesa/datastore")val query = new Query("gdelt")val rdd = GeoMesaSpark(params).rdd(new Configuration(), sc, params, query)GeoTools : GeoToolsSpatialRDDProvider
val params = Map( "geotools" -> "true", "file" -> "locations.csv")val query = new Query("locations")val rdd = GeoMesaSpark(params).rdd(new Configuration(), sc, params, query)4、SparkSQL
GeoMesa SparkSQL 支援基於Spark SQl 模組中存在的資料集(DataSet)/資料幀(DataFrame)API,以提供地理空間功能,包括自定義地理空間資料型別和函式,從地理工具資料儲存建立資料幀的能力,及改進SQL查詢效能的優化 。支援通過GeoTools 的DataStore 來建立 DataFrame。
1. 記憶體索引
2. 空間查詢
// Create DataFrame using the "geomesa" formatval dataFrame = sparkSession.read .format("geomesa") .options(dsParams) .option("geomesa.feature", "chicago") .load()dataFrame.createOrReplaceTempView("chicago")// Query against the "chicago" schemaval sqlQuery = "select * from chicago where st_contains(st_makeBBOX(0.0, 0.0, 90.0, 90.0), geom)"val resultDataFrame = sparkSession.sql(sqlQuery)5、GeoMesa PySpark
GeoMesa 提供了python執行介面,可以通過python 對GeoMesa 進行儲存,查詢,分析等。
geomesa_pyspark
mvn clean install -Ppythonpip3 install geomesa-spark/geomesa_pyspark/target/geomesa_pyspark-$VERSION.tar.gzcp geomesa-accumulo/geomesa-accumulo-spark-runtime/target/geomesa-accumulo-spark-runtime_2.11-$VERSION.jar /path/to/6、GeoMesa 部署
通過Jupyter Notebook/Zepplin 可以對部署在GeoMesa上的空間資料進行 查詢/展示等操作
Jupyter Notebook 部署Zeppelin 部署八、處理能力1、處理器
ArrowConversionProcess 轉換要素集合為arrow 格式
BinConversionProcess 轉換要素集合為BIN格式
DensityProcess 計算要素集合密度圖,輸出為圖片
DateOffsetProcess 根據輸入日期區間 修改要素集合指定欄位
HashAttributeProcess 根據輸入引數為輸入要素增加Hash值屬性
HashAttributeColorProcess 根據輸入引數為輸入要素增加Hash值屬性和一個顏色
JoinProcess 根據屬性資訊查詢要素
KNearestNeighborProcess 最近鄰查詢
Point2PointProcess 點集合轉換為線集合
ProximitySearchProcess 鄰近搜尋,返回要素集合
RouteSearchProcess 線路搜尋,沿著線路查詢沿線要素,而不是交叉要素
SamplingProcess 應用統計抽樣減少查詢返回的要素集
StatsProcess 對給定要素集合進行統計運算,即為 5.4
TrackLabelProcess XX 返回要素集合中一個頭相關的要素
TubeSelectProcess XX 根據引數對要素集合操作,生成一組要素集合 , 檢視WPS
QueryProcess 對給定要素集合執行CQL 查詢/過來,獲取要素
UniqueProcess 單一處理,用於獲取要素集合中單一屬性
Chaining Processes 用於處理連線流程, 一個輸出可作為另外一個的輸入, 檢視WPS
2、查詢
GeoMesa支援對資料儲存的查詢包含:
空間查詢:geographic rectangle
時間查詢:time range
屬性查詢:attribute filter
3、釋出
GeoServer支援對GeoMesa中的資料進行釋出,協議: WFS/WMS/WPS/WCS。
目前支援對 Accumulo/HBase/BigTable/Cassandra/Kafka/Lambda
GeoMesa Accumulo in GeoServer
GeoMesa HBase in GeoServer
GeoMesa Bigtable in GeoServer
GeoMesa Cassandra in GeoServer
GeoMesa Kafka in GeoServer
GeoMesa Lambda in GeoServer
4、 統計
GeoMesa提供的資料統計介面:StatsScan
count Count()
min/max MinMax("foo")
enumeration Enumeration("foo")
top-k TopK("foo")
frequency Frequency("foo",<precision>)
frequency (by time period) Frequency("foo","dtg",<time period>,<precision>)
Z3 frequency Z3Frequency("geom","dtg",<time period>,<precision>)
histogram Histogram("foo",<bins>,<min>,<max>)
Z3 histogram Z3Histogram("geom","dtg",<time period>,<bins>)
descriptive statistics DescriptiveStats("foo","bar")
5、分析
熱力圖 / 直方圖 / 密度圖 / 彙總統計 /D-within / 密度查詢:
val params = Map("hbase.zookeepers" -> "zoo1,zoo2,zoo3", "hbase.catalog" -> "geomesa")val query = new Query("gdelt")val rdd = GeoMesaSpark(params).rdd(new Configuration(), sc, params, query)6、 柵格
可釋出影像切片資料,需要GDAL進行資料切片,然後儲存Accumulo 進行資料釋出
九、命令列工具1、攝入命令
ingest: 匯入資料
支援的資料型別:arrow/avro/bin/csv,tsv/geosjon,json/gml/shp/leaflet
2、查詢/匯出命令
convert:資料型別轉換
explain:debug/problematic 除錯/問題定位
export: 匯出資料
支援的資料型別:arrow/avro/bin/csv,tsv/geosjon,json/gml/shp/leaflet
3、分析命令
統計分析包含:stats-bounds/stats-count/stats-histogram/stats-top-k
4、支援遠端檔案系統
Amazon’s S3
Microsoft’s Azure
十、專案地址專案地址:http://www.geomesa.org/
授權:Apache License Version 2.0協議。
十一、查詢型別時空查詢:區域 + 時間區間
空間查詢:區域資訊
時序查詢:軌跡檢視
屬性查詢:主題屬性資訊
典型查詢場景
某一個地理區域內在某個時間範圍發生的關鍵時間
一個任務區域的流量資訊
給出2017年受血吸蟲病影響的區域
查詢最佳20分鐘進入颶風區域的汽車
查詢某個點附近的酒店
查詢某嫌疑人在2018年8月的移動軌跡
PPT目錄結構
PPT中的體系架構
PPT中GeoHash原理