陆续根据Geomesa和自身GIS空间数据库经验梳理了5篇试验代码, 但是还没有好好思考总结下整个技术脉络,现总结如下:
Hbase特点:
1.
一个高可靠性、高性能、面向列、可伸缩的分布式存储系统
(
可认为不是数据库
,
他的数据写到
hdfs
)
2.
一个
KeyValue
存储系统
, key
和
Value
都支持
byte
存储得列式分布式数据源
;
3.
不支持事物
,
除非外部使用其他分布式事物组件封装
;
4.
Value
不支持索引
;
5.
所有数据按照
key
递增存储
,
这里将
hbase
理解为一个大得多层分布式
”
跳表
”
6.
所有数据默认带时间版本信息
,
默认过期版本
3,
它并不直接删除数据
7.
不
支持
SQL
查询
,
有三方组件可转换
where
字句到
hbaseFilter
复合对象
8.
基本概览
Namespace(
类似
database) table(
表
)
Rowkey
(
行键值
)
Family(
列簇
) Qualifier(
列
) Value(
值
);
开源,大厂,论文实现:
开源: GeoMesa
1.
它
是
一个开源的进行时空数据处理的
工具包
(
基于
Scala),
2.
locationtech
出品
,
与
JTS,
GeoTrellis
同源
,
社区较活跃
;
3.
可同时支持
HBase
、
Spark,kudu,Arrow,bigtable,kafa,redis
等
4.
Hbase+GeoMesa
相当于
Postgresql+POSTGIS
大厂: 基本上基于GeoMesa扩展自身业务;
1.
阿里
(
Hbase
Ganos
)
以
PaaS
提供
,
但是不支持
SQL
;(
GeoMesa
扩展
)
2.
华为
(
CloudTable
)
以
PaaS
提供
(
GeoMesa
扩展
)
3.
京
东
JUST
, (
可能是
GeoMesa
扩展
)
论文:
大规模时空数据分布式存储 方法研究 ( 中国科学院计算技术研究所 北京 1 0 01 9 0)2014
基于Hbase的海量GIS数据分布式处理实践 (中国科学院计算技术研究所 2016
客户端查询根据范围计算出Key, 然后用Key的范围去查询或者每条Key遍历取数据
核心总结抽象为一句话: 空间数据编码及根据范围查询出对应范围的编码序列key.
不管是Geomesa系列还是论文系列都是这个逻辑,只不过一个在客户端做,一个在服务端做
抽象为代码总结为以下接口:
byte[] encode(double xmin, double ymin, double xmax, double ymax);
double [] decode(byte[] bts);
ArrayList<byte[]> QueryRange(double xmin, double ymin, double xmax, double ymax);
最后做编码总结, 文字描述总是苍白无力, 来张图z2 和xz的编码顺序图 (注意不是编码图编码图网上一堆,这是编码后得顺序图)
另外有一个重要问题:
Z索引适合点被查询box包含,
XZ索引(面,线)很可能查询也只能满足包含查询, 而不是真正意义上的空间数据库级别的相交查询, 因为无法解决跨边界得问题, 如下图:
所以在前面尝试在空间数据表中加入了xmin, ymin,xamx,ymax 来过滤查询用4个SingleColumnValueFilter来解决, 虽然解决了问题, 但是没有大规模测试.,不敢说效率如何. base研究暂时到这里, 建议有能力的直接用geomesa