分布式海量空间数据处理的数据引擎-GeoMesa
connygpt 2024-10-16 08:44 8 浏览
一、概述
GeoMesa是由locationtech开源的一套地理大数据处理工具套件。定位是一个基于分布式数据库的海量空间数据处理的数据引擎(SDE),可在分布式计算系统上进行大规模的地理空间查询和分析。使用GeoMesa开源帮助用户管理、使用来自于物联网、社交媒体、手机应用的海量的时空(spatio-temporal)数据。
GeoMesa基于已有的GIS开源框架GeoTools,可以进行地理学方面的空间数据的处理,同时,GeoMesa也支持比较成熟的大数据框架进行数据的处理,存储和计算,此外GeoMesa本身还有其特有的时空索引的机制,尤其是对LineString,Polygon等要素提供的XZ索引机制,为时空数据在大数据场景中进行运用提供了很好的拓展。
关注并私信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上的空间数据进行 查询/展示等操作
- 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、摄入命令
? 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,获取大牛的PPT文件。
相关推荐
- 3分钟让你的项目支持AI问答模块,完全开源!
-
hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...
- 干货|程序员的副业挂,12个平台分享
-
1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...
- Github标星超200K,这10个可视化面板你知道几个
-
在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...
- 开箱即用的炫酷中后台前端开源框架第二篇
-
#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...
- 搭建React+AntDeign的开发环境和框架
-
搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...
- 基于.NET 5实现的开源通用权限管理平台
-
??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...
- StreamPark - 大数据流计算引擎
-
使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...
- 教你使用UmiJS框架开发React
-
1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...
- 简单在线流程图工具在用例设计中的运用
-
敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...
- 【开源分享】神奇的大数据实时平台框架,让Flink&Spark开发更简单
-
这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...
- 聊聊规则引擎的调研及实现全过程
-
摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...
- 【开源推荐】Diboot 2.0.5 发布,自动化开发助理
-
一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...
- 微软推出Copilot Actions,使用人工智能自动执行重复性任务
-
IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...
- Electron 使用Selenium和WebDriver
-
本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...
- Quick 'n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具
-
一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...
- 一周热门
- 最近发表
- 标签列表
-
- kubectlsetimage (56)
- mysqlinsertoverwrite (53)
- addcolumn (54)
- helmpackage (54)
- varchar最长多少 (61)
- 类型断言 (53)
- protoc安装 (56)
- jdk20安装教程 (60)
- rpm2cpio (52)
- 控制台打印 (63)
- 401unauthorized (51)
- vuexstore (68)
- druiddatasource (60)
- 企业微信开发文档 (51)
- rendertexture (51)
- speedphp (52)
- gitcommit-am (68)
- bashecho (64)
- str_to_date函数 (58)
- yum下载包及依赖到本地 (72)
- jstree中文api文档 (59)
- mvnw文件 (58)
- rancher安装 (63)
- nginx开机自启 (53)
- .netcore教程 (53)