使用Phoenix为Hbase表创建二级索引

本文介绍了如何配置Hbase以支持Phoenix创建二级索引,包括修改regionserver和master节点的配置文件。创建索引后查询性能显著提升,但要注意索引更新的问题。当直接在Hbase中插入数据时,索引不会自动更新,需要手动维护。解决方案是在插入数据的同时更新索引表。
摘要由CSDN通过智能技术生成


1 利用Phoenix为Hbase表创建二级索引

转自 https://blog.csdn.net/u011491148/article/details/45749807

1.1配置Hbase支持Phoenix创建二级索引

对于Hbase,如果想精确定位到某行记录,唯一的办法就是通过rowkey查询。如果不通过rowkey查找数据,就必须逐行比较每一行的值,对于较大的表,全表扫描的代价是不可接受的。

1.1.1 修改Hbase的regionserver节点的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>
    <description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
</property>
<property>
    <name>hbase.rpc.controllerfactory.class</name>
    <value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>
    <description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
</property>

注意:网上配置文档里有这一条,但在实际测试中(测试环境hbase-1.3.1,网上0.98.6),加入该条的regionserver会在hbase启动时失败,对应节点上没有HregionServer进程,去掉该配置后正常启动,且能正常创建local index。

<property>
    <name>hbase.coprocessor.regionserver.classes</name>
    <value>org.apache.hadoop.hbase.regionserver.LocalIndexMerger</value>
</property>

还有一点,hbase-site.xml的zookeeeper的配置信息不能加2181,否则在创建local index的时候会报以下异常:

正常配置

<property>
	<name>hbase.zookeeper.quorum</name>
	<value>hadoop102,hadoop103,hadoop104</value>
</property>

1.1.2 修改Hbase的master节点的hbase-site.xml配置文件

注意,如果master节点上也有regionserver,那么master节点配置如下,否则不需要regionserver的配置参数。

<!-- phoenix master 配置参数 -->
<property>
    <name>hbase.master.loadbalancer.class</name>
    <value>org.apache.phoenix.hbase.index.balancer.IndexLoadBalancer</value>
</property>
<property>
    <name>hbase.coprocessor.master.classes</name>
    <value>org.apache.phoenix.hbase.index.master.IndexMasterObserver</value>
</property>
<!-- phoenix regionserver 配置参数 -->
<property>
    <name>hbase.regionserver.wal.codec</name>
    <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>

1.2 创建索引

配置好以上配置信息之后,重启Hbase,以下测试环境通过Phoenix映射Hbase中已有的表,数据量743569行,202M,当然也可以通过Bulkload直接在Phoenix创建表并插入数据影响Hbase。

1.2.1 未创建索引信息时,用时6.08s

select "uploader" from "hive_hbase_youtube" where "uploader"='karianahhk';

在这里插入图片描述

1.2.2 创建索引,用时0.014s

create index "youtube_index2" on "hive_hbase_youtube" ("info"."uploader");

在这里插入图片描述在这里插入图片描述

1.3 关于Phoenix创建的HBase二级索引的更新问题

1) 在使用Phoenix创建Hbase的二级索引表之后,在Phoenix中看不到新建的索引表,但是在Hbase表中可以看到索引表。
在这里插入图片描述

现在,有一个问题,可以看到同一个表中查询的数据却不同,原因是Jarry是直接向Hbase表插入的数据,而Phoenix已经为name字段创建索引,这时就查询不到Jarry,但是通过Phoenix的映射表向Hbase插入的数据数据查询索引字段可以查询到。
在这里插入图片描述

2) 问题是,如果绕开Phoenix向Hbase表插入数据,那么索引表就不会动态更新。
解决方案:
现有的解决方案是,在通过Hbase向表中插入数据时,我们要向索引表中也插入一条索引数据。那么查看以下索引表数据:
在这里插入图片描述

其实索引的rowkey就是索引字段+rowkey,那么我们插入一条:

put 'name',"Jarry\x001003",'0:_0','x'

在这里插入图片描述
3) 再次查询Phoenix中的索引字段,可以显示索引字段了。
在这里插入图片描述
有关索引的扩展请访问 https://blog.csdn.net/qq_41665356/article/details/80278125

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值