HBase应用(五):二级索引

HBase提供了检索数据的功能,不过原有系统仅提供了通过rowkey检索数据的功能,过于单一,不够灵活,一旦查询条件改变了,往往涉及到要全表扫描过滤,极大浪费机器物理资源,又达不到实时效果;HBase二级索引功能解决了原有HBase系统中仅能够通过rowkey检索数据的问题,使得用户能够指定多种条件,在HBase表中进行数据的实时检索与统计,提供了强大的数据检索功能。

HBase只提供了一个基于字典序的主键索引,在查询中只能通过行键或扫描全表来获取数据。如下图,需求是查找符合F:C1=C11的F:C2的值,因为不知道rowkey,所以就需要扫描全表,但是如果这时候,我们新建一张索引表,这张表的rowkey是F:C1的value(C11,C12,C13),column列是源表中的C11对应的rowkey(RK1),这时候,再查询就可以先从索引表中根据rowkey查到RK1,然后使用RK1去原表中查找value。这样性能会提高很多


13194828-1a08889dad5e7d12.png
image.png

实现方案一:使用HBase Coprocessor协处理器
CoProcessor相当于HBase的Observer+hook,目前支持MasterObserver、RegionObserver和WALObserver,基本上对于HBase Table的管理、数据的Put/Delete/Get等操作都可以找到对应的pre*和post。这样如果需要对于某一项Column建立Second indexing,就可以在Put/delete的时候,将其信息更新到另外一张索引表中。对于Indexing里面的value值是否存储的问题,可以根据需要进行控制,如果value的空间开销不大,逆向的检索又比较繁琐,可以直接存储在Indexing table中,反之则避免这种情况。

13194828-fec8ca688c55167b.png
image.png

实现方案二:由客户端发起对主表和索引表的Put、Delete操作的双重操作
1、设置主表的TTL(Time To Live)比索引表小一点,让其略早一点消亡
2、不要在IndexingTable存储value值
3、Put操作时,对于操作的主表的所有列,先使用同一的Local TimeStamp的值更新到IndexIng Table,然后使用该TimeStamp插入主表数据
4、Delete操作时,首先操作主表的数据,然后再去更新Indexing Table的数据

实现方案三:Phoenix
Phoenix是一个开源的HBASE SQL层。它不仅可以使用标准的JDBC API替代HBASE client API创建表,插入和查询HBASE,也支持二级索引、事物以及多种SQL层优化;
可以参考https://yq.aliyun.com/articles/574090

猜你喜欢

转载自blog.csdn.net/weixin_34107955/article/details/87237887