分享嘉宾:肖斐 阿里巴巴 技术专家
文章整理:唐唯汉
内容来源:Cassandra Meetup
出品平台:DataFunTalk
注:欢迎转载,转载请留言。
导读:时空数据,其实随着现在大家 5G 的普及,已经成为一种重要的数据类型,例如快递数据,朋友圈位置信息,天气遥感信息等,这些都属于时空数据。而基于类似 Cassandra 这种传统 NoSQL 数据库对时空数据进行管理也存在一些挑战,所以今天就分享一下基于 Cassandra 数据库时空数据管理方面的探索。
本次分享的主题为 Cassandra 在时空数据上的探索,主要介绍:
❶ 时空基础
❷ GeoMesa
❸ GeoTrellis
❹ Ganos
▌时空基础
首先给大家介绍时空数据:
❶ 时空数据
时空数据是一类比较特殊应用比较广泛的数据。根据16年的权威报告,80%数据都与时空有关。它的重要性体现在于是各类数据融合的一个基础。我们要利用一种框架将多元的数据组合在一起放在同一个架构里面进行一些分布的分析,而时空数据正是这样一种很好的载体,我们可以将各种各样的数据放在时空框架下进行一些统计分析和预测。
时空主要可以分为以下四种:
矢量数据:几何数据,在数学中可以用矢量表示的数据。
栅格数据:主要应用于遥感影像,与第一类区别于将空间划分为格网,每个格网填充信息。
点云数据:因为高精定位,三维建模的需求,通过激光点反射在时间上位置分布的方式对空间进行建模。
轨迹数据:主要是出行和快递这类强时空数据。
❷ 数据库时空引擎
数据库时空引擎是一种介于数据库和用户应用之间的中间件系统。它对下基于数据库提供的接口和数据库自身的能力对数据进行管理;对外提供统一的数据接口,实现空间数据的查询和管理。
为了实现这些能力,有四个基本要素:
空间对象:即前面提到的时空数据
时空索引:在数据库中对这些时空数据进行索引
序列化:空间信息的序列化存储方式
时空查询:如何在时空数据上利用数据库的查询能力
在描述时空数据有空间要素的基本概念:
SimpleFeature:基本的空间单元, 默认含有 Geometry 字段
SimpleFeatureType:要素对应的属性,即数据库的 schema
WKT:数据库对要素描述一种规范
❸ 空间填充曲线 ( SFC )
对于 Cassandra,我们必须按照 KV 进行存储和查询,并不能满足复杂的时空查询需求。所以对时空数据,我们需要将时空数据查询转换为 NoSQL 数据库可以接受的查询格式。
而这里就是利用时空填充曲线进行这种转换:用一条布满整个空间的曲线链接空间上的各个单元,实现了多维空间向一维空间的转换,从而可以将多维查询比较转换为在 Key 上的查询比较。常见的曲线有如下的:Z 曲线和 Hilbert 曲线。
❹ 时空编码:GeoHash
当映射到了时空曲线之后,我们就需要对其进行编码,以方便进行比较。
这里介绍的就是 GeoHash。工作原理是对空间进行二分:
对于纬度:0~90为1,0~-90为0
对于经度:0~180为1, 0~-180为0
这样就会根据经纬度形成二进制数,之后进行逐层二分,将这些二进制数组合在一起形成一个二进制数,转化为整形作为 GeoHash 编码。
GeoHash 的特性:
① 可以根据相应大小进行点查找,数据越相似越近
② 可以利用层级对精度进行控制,可以利用 2^2n 个数来表示 n 级数据,从而可以根据需要选择精度
而我们在查找时,通过空间填充曲线和 GeoHash 编码可以如下进行查询:
用户确定查询窗口
根据指定的层次确定限定窗口将 Hilbert 曲线剖分出的区域
每个区域对应一个 range 进行区域表示
通过这个 range,就可以在数据库中进行查询,每一个 range 对应一次查询
▌GeoMesa
❶ GeoMesa
GeoMesa:基于 NoSQL 进行矢量数据的管理,主要是面向大数据分析场景。
主要的部署场景如下图:
他提供 ETL 工具接入流式数据,利用 Kafka 进行缓存, 支持 NoSQL 数据库,Spark,MapReduce 分析框架,对外通过 webserver 提供地图服务。
❷ 时空索引
Z2: 空间, 点索引
Z3: 时间+空间,点索引
XZ2: 空间, 线/面索引
XZ3: 时间+空间,线/面索引
每一份数据会存在对应的索引上,总共会存放四次,这就造成了数据的冗余,会带来一定的数据膨胀率。但是这种空间换时间,带来的就是在查询时会非常快,可以高效率的进行查询。
然而这种存储会因为空间数据分布不均匀带来数据倾斜引起数据热点问题,为了解决这个问题,GeoMesa 在 key 上设计为:
1-Byte 的随机数用于避免热点
2-Bytes 用于时间切分,主要用在时序数据
8-Bytes 用于存储 GeoHash 编码
Key 里会有一个 Feature ID 进行数据标识,用于区分格网内部的点
❸ Cassandra 存储方案
如下1图所示,以 gdelt 提供的时空数据为例,这是一个配有经纬度和时间的事件数据。我们可以看到针对这个场景生成了四张表,其中 z2 代表空间,z3 代表空间+时间。这里四张表分别代表:attr 存储分类数据,id 存储 id 数据,z2,z3 代表时空数据。而 gdelt 表存储元数据,根据查询的属性到对应的表中进行查询。
如下图就是具体的存储格式,查询时通过 shard 确定查询的 node,通过 z 扫描要查询的要素,通过 fid 进行区分,通过 sf 获取时空要素对象。
注意:geo 查询只能到格网,因此需要进行一次精查询在格网内部查询。具体代码如下图:
GeoMesa 也提供了 Spark 的接口,通过 GeometryRDD 将空间要素转换为 RDD,从而可以利用 spark 进行分析。
❹ GeoMesa Spark 应用案例
▌GeoTrellis
❶ 栅格数据模型
主要是应用在栅格数据,如下图通过一个数学模型对地球进行表示,从而可以具体的分析,详细步骤如图:
❷ GeoTrellis
GeoTrellis 提供了一种转换框架,通过内嵌的 spark 模块将数据模型转换为 RDD,然后通过 Key,Tile 写入到其他存储介质中。
具体实现可以参考如下图:
根据应用场景进行重投影
按照需要进行数据切分为网格
将网格转换为 tile,并根据空间填充曲线编码转换为 GeoHash
存储在特定存储
❸ 发布流程:
这里就是通过发布 tile 的方式进行数据更新和发布。
❹ 应用展示:
如下图就是一个利用 SRTM 数据生成的高层影像。
❺ RasterFrame
提供地理信息提取功能,集成了 python 和 spark 的学习包,主要应用于遥感影像分析的一个平台。
▌Ganos
阿里云原生的时空引擎,用于时空数据管理。
提供的底层存储包括:
本次的分享就到这里,谢谢大家。
PS:欢迎加入 Cassandra 交流群,与小伙伴们一起讨论计算广告相关问题。加管理员微信 ( 微信号:DataFunTalker ) 或识别文末二维码,回复:Cassandra,会自动拉你进群。
肖斐
——END——
文章推荐:
一个「在看」,一段时光!👇