一、概述

GeoMesa是由locationtech开源的一套地理大数据处理工具套件。定位是一个基于分布式数据库的海量空间数据处理的数据引擎(SDE),可在分布式计算系统上进行大规模的地理空间查询和分析。使用GeoMesa开源帮助用户管理、使用来自于物联网、社交媒体、手机应用的海量的时空(spatio-temporal)数据。

GeoMesa基于已有的GIS开源框架GeoTools,可以进行地理学方面的空间数据的处理,同时,GeoMesa也支持比较成熟的大数据框架进行数据的处理,存储和计算,此外GeoMesa本身还有其特有的时空索引的机制,尤其是对LineString,Polygon等要素提供的XZ索引机制,为时空数据在大数据场景中进行运用提供了很好的拓展。

必须了解的实时数据架构(分布式海量空间数据处理的数据引擎-GeoMesa)(1)

基础架构

必须了解的实时数据架构(分布式海量空间数据处理的数据引擎-GeoMesa)(2)

GeoMesa体系架构

关注并私信GeoMesa,获取大牛的PPT文件。

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 //空间查询 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.MergedViewConfigLoader

5 其他存储

Google Bigtable 、Kudu、Lambda、NiFi、BlobStore: 具有时空索引的二进制大数据。

七、GeoMesa Spark

GeoMesaSpark 允许在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_geometryN st_interiorRingN,st_isClosed,st_isCollection,st_isEmpty,st_isRing st_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 functions val 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" format val dataFrame = sparkSession.read .format("geomesa") .options(dsParams) .option("geomesa.feature", "chicago") .load() dataFrame.createOrReplaceTempView("chicago") // Query against the "chicago" schema val 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上的空间数据进行 查询/展示等操作

  1. Jupyter Notebook 部署
  2. 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、摄入命令

​ delete-features: 删除数据

​ 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月的移动轨迹

必须了解的实时数据架构(分布式海量空间数据处理的数据引擎-GeoMesa)(3)

PPT目录结构

必须了解的实时数据架构(分布式海量空间数据处理的数据引擎-GeoMesa)(4)

PPT中的体系架构

必须了解的实时数据架构(分布式海量空间数据处理的数据引擎-GeoMesa)(5)

PPT中GeoHash原理

关注并私信GeoMesa,获取大牛的PPT文件。

,