基于Phoenix构建hbase的二级索引

HBase表后期按照rowkey查询性能是最高的。rowkey就相当于hbase表的一级索引,但是后期我们进行查询的时候大多时候都会按照一定条件去查找,这时我们是不知道rowkey的值,我们也可以通过hbase的过滤器去实现,但是在查询的时候会触发大量的底层文件扫描,效率比较低,这时我们可以以空间去时间 去实现hbase的二级索引,提高查询效率。

Hbase二级索引:

  • 为了HBase的数据查询更高效、适应更多的场景,诸如使用==非rowkey字段检索==也能做到秒级响应,或者支持各个字段进行模糊查询和多字段组合查询等, 因此需要在HBase上面构建二级索引, 以满足现实中更复杂多样的业务需求。
  • hbase的二级索引其本质就是建立HBase表中列与行键之间的映射关系。

hbase二级索引思想:

                              

Phoenix+hbase方案 :

 在hbase-site.xml

<property>
    <name>hbase.regionserver.wal.codec</name>
    <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
<property>
   <name>hbase.region.server.rpc.scheduler.factory.class</name>
   <value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value>
</property>
<property>
        <name>hbase.rpc.controllerfactory.class</name>
        <value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>
</property>

实操:

一张USER_INFO表中有50万条数据

在hbase中查询count 使用了38.7s

在Phoenix 中创建映射表

create view USER_INFO(
   "ROWKEY" varchar primary key,
   "INFO"."IID"  varchar,
   "INFO"."ICRED"  varchar,
   "INFO"."ITIME"  varchar,
   "INFO"."IPASSWORD"  varchar,
   "INFO"."IAGE"  varchar,
   "INFO"."IUSE"  varchar,
   "INFO"."IJSP"  varchar,
   "INFO"."IWIN"  varchar,
   "INFO"."IBROWSER"  varchar,
   "INFO"."IIP"  varchar,
   "INFO"."IPROVINCE"  varchar,
   "INFO"."ICITY"  varchar,
   "INFO"."IPAGE"  varchar,
   "INFO"."IGOODS"  varchar,
   "INFO"."ISHOP"  varchar
) as select * from USER_INFO;

 

在Phoenix中查询数量:

      

可以看到只用了8.883s 但是这个时间还有没有达到毫秒级别,这里我们可以通过在Phoenix中建立索引。

查询IAGE 为77的数据 ,用时6.45s

 

Global Indexing

  • 全局索引,适用于读多写少的业务场景
  • 使用Global indexing在写数据的时候开销很大,因为所有对数据表的更新操作(DELETE, UPSERT VALUES and UPSERT SELECT),都会引起索引表的更新,而索引表是分布在不同的数据节点上的,跨节点的数据传输带来了较大的性能消耗
  • 在读数据的时候Phoenix会选择索引表来降低查询消耗的时间。在默认情况下如果想查询的字段不是索引字段的话索引表不会被使用,也就是说不会带来查询速度的提升

Local Indexing

  • 本地索引,适用于写操作频繁以及空间受限制的场景
  • 与Global indexing一样,Phoenix会自动判定在进行查询的时候是否使用索引
  • 使用Local indexing时,索引数据和数据表的数据存放在相同的服务器中,这样避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销。
  • 使用Local indexing的时候即使查询的字段不是索引字段索引表也会被使用,这会带来查询速度的提升,这点跟Global indexing不同。对于Local Indexing,一个数据表的所有索引数据都存储在一个单一的独立的可共享的表中。

测试使用 Global Indexing创建全局索引:

        create index USER_COOKIE_ID_INDEX on USER ("IAGE"); 

查询IAGE 为77的数据 :
        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值