GeoMesa 整体介绍

GeoMesa

一、概述

在HBase ,Accumulo, Cassandra,Kafka 和 Spark 上 提供对 时空数据的 存储,索引,查询并且转换。

GeoMesa 是一个运行在分布式系统上能够进行大规模地理空间数据查询和分析的开源套件空间集。GeoMesa在Accmulo,HBase,Google BigTbale,Cassandra 之上提供了对点,线,面的时空索引。GeoMesa可以通过在Kafka上对时空数据进行分层语义,实现近实时的流处理。通过GeoServer,GeoMesa支持对各种现有的客户端,通过标准OGC(开放地理空间联盟)API 和协议(WFS/WMS)进行集成。GeoMesa支持Spark进行自定义分布式地理空间分析。

../_images/GMHadoopInfrastructure.png

二、整体能力

​ 2.1 存储千兆字节到PB的空间数据(上百亿个点或更多)

​ 2.2 秒级提供 千万点获取

​ 2.3 单节点秒级接受数据数据 超过10 000条记录

​ 2.4 轻松水平扩展

​ 2.5 支持Spark分析

​ 2.6 支持GeoServer或其他OGC客户端驱动地图

三、解决场景

  1. 你拥有大空间数据集,并且查询性能已经达到 关系型数据库瓶颈,你正在研究分片策略并且考虑新的存储解决方案

  2. 你有非常高的流量数据并且需要高读写

  3. 你的分析操作在云端,可能考虑用Spark,并且想具备空间分析能力

  4. 你正在寻找Paas(平台即服务)存储来作为你的大空间数据存储

  5. 你打算用OGC定义的CQL(通用查询语言) 来过滤数据

四、模块及概念

4.1 空间索引

​ GeoMesa默认会为geometry 和date 创建 几种索引。

​ z2/xz2/ Point的空间索引和时空索引, 字段名:Geometry

​ z3/xz3/ LineString和Polygon的空间索引和时空索引,字段名:Geometry 和 Date

​ id/ 根据featureID 构建索引

​ attr 根据属性值构建索引

4.2 时空数据

​ 索引:Geohash + 日期时间字符串

​ 查询:查询计划实际上是一个位于所需地理区域和时间间隔内的连续单元格范围的列表

​ 如: -180≤经度<45 , -90≤纬度<22.5 ,0 <time <9

4.3 API

GeoMesaIndex<DomainObject>   //空间索引
AccumuloGeoMesaIndex 
GeoMesaQuery   				//空间查询
DomainObject

五、输入能力

​ GeoMesa Convert 配置扩展库,从GeoTools库 转换 SimpleFeature 到 GeoMesa中,该工具可以通过定义JSON文件进行数据导入,免写代码

​ 支持的数据类型:

​ JSON / XML /

​ ShapeFile/

​ JDBC /

​ 分隔文本(CSV,EXCEL,MYSQL) /

​ Avro /Fixed Width Text

六、存储能力

根据存储介质,数据形态及分析需求 可以把数据分为:分布式NoSQL存储,实时流存储,分布式文件系统 ,混合存储和 其他。

6.1 分布式NoSQL存储

分布式NoSQL存储主要用于大规模空间数据,对计算性能有要求。

HBase 支持分布式,用的最广泛

Accumulo 支持分布式,支持高级安全功能

Cassandra 用的最广泛

6.2 实时流存储

实时流存储主要用于流式数据存储,主要用于实时计算。

Kafka

Redis

6.3 分布式文件系统存储

对空间分析和实时性要求不高,可以考虑分布式文件系统存储。

FileSystem(Hadoop HDFS,AWS S3,Google FileStorage, Azure BlobStore, Local disk)

​ 支持读取各种现有数据,没有数据库不高效

6.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 

6.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。

7.1 Spark JTS

​ Spark JTS 模块支持用户定义UDFs (用户定义函数)和 UDTs(用户定义类型),函数和类型支持在 Spark上 执行SQL 查询,从而对 空间数据类型执行空间操作。

​ 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`

7.2 Spark Core

geometry-spark-core被直接用RDDs 处理存储在GeoMesa 的要素。

接口为 :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)

7.3 Spatial RDD Providers

GeoSpark 支持的数据存储:Accumulo,HBase,FileSystem,GeoTools等

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)

7.4 SparkSQL

​ GeoMesa SparkSQL 支持基于Spark 的 Dataset/DataFrame API 来提供空间空间能力,包括自定义地理空间类型和功能,支持通过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)

7.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/

7.6 GeoMesa 部署

​ 通过Jupyter Notebook/Zepplin 可以对部署在GeoMesa上的空间数据进行 查询/展示等操作

  1. Jupyter Notebook 部署
  2. Zeppelin 部署

八、处理能力

8.0 处理器

ArrowConversionProcess 转换要素集合为arrow 格式

BinConversionProcess 转换要素集合为BIN格式

DensityProcess 计算要素集合密度图,输出为图片

DateOffsetProcess 根据输入日期区间 修改要素集合指定字段

HashAttributeProcess 根据输入参数为输入要素增加Hash值属性

HashAttributeColorProcess 根据输入参数为输入要素增加Hash值属性和一个颜色

JoinProcess 根据属性信息查询要素

KNearestNeighborProcess 最近邻查询

Point2PointProcess 点集合转换为线集合

ProximitySearchProcess 邻近搜索,返回要素集合

RouteSearchProcess 线路搜索,沿着线路查询沿线要素,而不是交叉要素

SamplingProcess 应用统计抽样减少查询返回的要素集

StatsProcess 对给定要素集合进行统计运算,即为 5.4

TrackLabelProcess ?? 返回要素集合中一个头相关的要素

TubeSelectProcess ?? 根据参数对要素集合操作,生成一组要素集合 , 查看WPS

QueryProcess 对给定要素集合执行CQL 查询/过来,获取要素

UniqueProcess 单一处理,用于获取要素集合中单一属性

Chaining Processes 用于处理连接流程, 一个输出可作为另外一个的输入, 查看WPS

8.1 查询

​ GeoMesa支持对数据存储的查询包含:

​ 空间查询:geographic rectangle

​ 时间查询:time range

​ 属性查询:attribute filter

8.2 发布

​ 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

8.3 统计

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")

8.4 分析

​ 热力图 / 直方图 / 密度图 / 汇总统计 /D-within / 密度查询:

KryoLazyDensityIterator

8.5 栅格

​ 可发布影像切片数据,需要GDAL进行数据切片,然后存储Accumulo 进行数据发布

九、命令行工具

9.1 摄入命令

​ delete-features: 删除数据

​ ingest: 导入数据

​ 支持的数据类型:arrow/avro/bin/csv,tsv/geosjon,json/gml/shp/leaflet

9.2 查询/导出命令

​ convert:数据类型转换

​ explain:debug/problematic 调试/问题定位

​ export: 导出数据

​ 支持的数据类型:arrow/avro/bin/csv,tsv/geosjon,json/gml/shp/leaflet

9.3 分析命令

​ 统计分析包含:stats-bounds/stats-count/stats-histogram/stats-top-k

9.4 支持远程文件系统

​  Amazon’s S3

​ Microsoft’s Azure

附录

Jupyter Notebook

geomesa_pyspark

发布了220 篇原创文章 · 获赞 16 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/zhanggqianglovec/article/details/103761689