读书笔记-HBase in Action-第三部分应用-(2)GIS系统

本章介绍用HBase存储、高效查询地理位置信息。

Geohash空间索引

考虑LBS应用中常见的两个问题:1)查找离某地最近的k个地点;2)查找某区域内地点。如果要用HBase实现高效查找,首先要考虑的是空间局部性(Spatial Locality),即位置上相近的点得物理存储在一起。最简单的地理位置数据由两个维度组成:经度X和纬度Y,那么相对应最简单的Rowkey也可以由X和Y组成。Rowkey的有序性决定了数据首先按照经度X排序,再按照纬度Y排序,这种方式最大的问题是经度值相等的A地点和B地点,可能纬度上相差十万八千里。

Geohash的解决思路是将经度和纬度以相同的权重构建空间索引。具体算法如下图:在经度范围[-180,180],纬度范围[-90,90]内不断进行二分查找,如果值位于上半区则记标识位为1,位于下半区则记标识位为0。最终结果由经度纬度标识位交叉组成。(注:在HBase中可以存储标识位的Base32编码串,每个字符是5个bit位的编码结果)

观察以下数据样例,可知geohash较好地反映了空间局部性:数据按照距离远近有序排列,距离相近的点geohash值有着更多的相同前缀。

查找最近K个邻居

通过扫描geohash前缀可以高效解决问题1:查找离某地最近的k个地点。当然,需要选择合适的位数来进行前缀匹配扫描。使用较少的位数能减少扫描次数,但可能会返回多余的数据,而使用较多的位数能可能每次扫描返回的结果优先,导致需要多次扫描。

然而,geohash值也存在一些问题,不能使用简单的前缀匹配扫描来查找邻居,如下图:有限长度的geohash值在地图上表示为一个矩形区域。位于中间的是dr5ruzb区域,它下方的邻居区域和它有着5位长度的相同前缀,而上方的三个区域虽然位置相邻,但只有这2位长度的相同前缀。

所以,如果要查找dr5ruzb的最近k个邻居,保险起见,可以一起查找它周围8个相邻区域的最近k个邻居,然后将所有查找到的点按照距离排序再得出最终结果。伪代码如下:takeN查找某个区域的最近n个点

queryKNN则使用takeN查找四周8个相邻区域的最近n个点,最终再排序取值。

区域内查找

来一个区域内查找的实例:在某某广场内有多少个wifi热点?解决思路分两步:

第一步,将区域内查找转化为对一系列geohash索引的扫描。

第二步,判断扫描到的坐标点是否包含在待查找区域多边形内。

工具方面,可以使用JTS Topology Suite(http://tsusiatsoftware.net/jts/main.html),JTS实现了常见几何对象、空间拓扑数据结构和操作算法。使用JTS查找待扫描的geohash坐标具体步骤如下:

  1. 根据待查找区域的各个顶点初始化多边形对象Geometry,并得出多边形对象的质心Centroid。
  2. 对质心Centorid坐标进行geohash编码,精度取一定位数,如果geohash编码所代表的闭包已经覆盖了待查找多边形对象Geometry,那么直接返回质心作为待扫描的坐标。如果没有覆盖,继续步骤3。
  3. 与前一节类似做法找到质心Centroid的四周8个相邻区域,闭包的范围扩大至包含这8个相邻区域顶点,再次判断闭包是否覆盖待查找区域。如果覆盖,那么这9个点一起作为待扫描的坐标返回;如果还是不能覆盖,返回到步骤2,使用更短的geohash编码长度来扩大位置范围,直到覆盖待查找区域为止。

得到待扫描geohash坐标后,使用前一节最近K个邻居查找算法在HBase表中扫描出一系列附近坐标点,最后过滤掉不在待查找区域范围内的坐标点。其中,过滤步骤可以通过Filter过滤器完成,能利用上HBase的分布式并行处理能力,减少到客户端的数据传输量。

时间: 2024-10-24 14:09:42

读书笔记-HBase in Action-第三部分应用-(2)GIS系统的相关文章

读书笔记-HBase in Action-第三部分应用-(1)OpenTSDB

OpenTSDB是基于HBase的开源监控系统,可以支持上万规模集群监控和上亿数据点采集.其中TSDB代表Time Series Database,OpenTSDB在时间序列数据的存储和查询上都做了相当多的优化工作. 架构Overview 概念上OpenTSDB由三部分组成:tcollector数据采集.tsd数据服务和HBase数据存储. 数据采集流程 如上图,tcollector后台进程运行在每台被监控的服务器上,管理数据收集脚本,定期执行,失败时重启,确保所有的监控数据发送给OpenTSD

读书笔记-HBase in Action-第二部分Advanced concepts-(2)Coprocessor

Coprocessor是HBase 0.92.0引入的特性.使用Coprocessor,可以将一些计算逻辑下推到HBase节点,HBase由一个单纯的存储系统升级为分布式数据处理平台. Coprocessor分为两种:Observer和Endpoint.Observer能修改扩展已有的客户端操作功能,而Endpoint能引入新的客户端操作. Observer Observer的作用类似于数据库的触发器或者AOP中的advice.下图为Put操作增加Observer,其中1-2-4-6是一次正常的

读书笔记-HBase in Action-第二部分Advanced concepts-(3)非Java客户端

HBase Shell HBase shell使用起来最方便,进入HBase shell控制台即可使用. $ $HBASE_HOME/bin/hbase shell 常见操作有create(创建表)/put(插入或更新数据)/get(根据rowkey查询)/scan(范围查询)/delete(删除列)/deleteAll(根据rowkey删除整行数据)/disable&drop(禁用表之后再删除). 基于数据库的项目,往往会在某个目录下存储专门的sql脚本,记录每次迭代数据库变更:同理,HBas

读书笔记-HBase in Action-第二部分Advanced concepts-(1)HBase table design

本章以山寨版Twitter为例介绍HBase Schema设计模式.广义的HBase Schema设计不只包括创建表时指定项,还应该综合考虑Column families/Column qualifier/Cell value/Versions/Rowkey等相关内容. 灵活的Schema&简单的存储视图 Schema设计和数据存储及访问模式关系密切,先回顾下HBase数据模型,有几个要点: 被索引的部分包括Row Key+Col Fam+Col Qual+Time Stamp 由于HBase的

[读书笔记]了不起的node.js(三)

这周的nodejs学习内容为几个依赖包的使用,把书上的例子都敲了一遍.这篇就以例程为线索,复习一下一周的工作. 1.connect 这个例程主要是使用connect依赖包,connect提供一个中间件(由函数组成,与请求.响应对象交互)的功能.书中也介绍了connect内置其他的中间件,这些中间件起到组织代码完成web功能的作用. 2.session 使用connect进行用户会话,进行基本的登录系统.通过中间件实现了检查登录.展示表单.用户匹配.处理登出的功能.展示了中间件的强大和组织方式.

HBase in Action前三章笔记

近期接触HBase,看了HBase In Action的英文版.開始认为还行,做了些笔记.可是兴许看下去,越来越感觉到实战这本书比較偏使用上的细节,对于HBase的具体设计涉及得很少.把前三章的一些笔记帖一下.后面几章内容不打算整理了.并非说书内容不好. key-value存储.强一致性,多个RegionServer节点对client端是不暴露细节的 使用场景:典型的web-search, capture incremental data, ad. click stream, content s

读书笔记-HBase in Action-第一部分 HBase fundamentals

新项目准备上HBase.HBase眼下由组里某牛负责.本着学会使用HBase的目标,先阅读下HBase in Action,一共十章组织成三部分,须要学习的内容包含HBase基本实现原理,用法,Schema设计原则和实战等.借用Michael Stack(HBase Chair)的话,"At a highlevel, HBase is like theatomic bomb. Its basic operation can be explained onthe back of a napkin

驱动开发读书笔记. 0.02 基于EASYARM-IMX283 烧写uboot和linux系统

驱动开发读书笔记. 0.02 基于EASYARM-IMX283 怎么烧写自己裁剪的linux内核?(非所有arm9通用) 手上有一块tq2440,但是不知道什么原因,没有办法烧boot进norflash或者nandflash:只好用另一块arm9(i.mx283a)来继续学习: 从开发教程上面可知,烧写uboot和Linux是通过各种批处理脚本和exe程序来执行的,称之为固件烧写,然而并没有需要我们选择uboot路径.Linux内核和文件系统的地方.这样的话是不是意味着只能烧写官方默认提供的文件

《HTTP权威指南》读书笔记(第一章~第三章)

第一章 HTTP概述 超文本传输协议 HTTP(HyperText Transfer Protocol) Web服务器使用HTTP协议,通常也称HTTP服务器.Web服务器是Web资源(Web resource)的宿主.最简单的Web资源就是Web服务器文件系统中的静态文件.这些文件可包括任意内容:文本.HTML.图片.视频等等.Web服务器会为所有HTTP对象数据附加一个MIME类型的数据格式标签.(Multipurpose Internet Mail Extension 多用途因特网邮件扩展