Phoenix快速入门系列(3) | 一文教你如何在Phoenix中创建 HBase 二级索引

2020-10-28 17:06:59 浏览数 (1)

一. HBase 的二级索引

  在前面的学习中, 我们知道 HBase 只能通过 rowkey 进行搜索, 一般把 rowkey 称作一级索引. 在很长的一段时间里 HBase 就只支持一级索引.   HBase 里面只有 rowkey 作为一级索引, 如果要对库里的非 rowkey 字段进行数据检索和查询, 往往要通过 MapReduce/Spark 等分布式计算框架进行,硬件资源消耗和时间延迟都会比较高。   为了 HBase 的数据查询更高效、适应更多的场景, 诸如使用非 rowkey 字段检索也能做到秒级响应,或者支持各个字段进行模糊查询和多字段组合查询等, 因此需要在 HBase 上面构建二级索引, 以满足现实中更复杂多样的业务需求。   从 0.94 版本开始, HBase 开始支持二级索引.   HBase 索引有多种放方案, 我们今天要做的是使用 Phoenix 给 HBase 添加二级索引.

二. 配置 HBase 支持 Phoenix 创建二级索引

  需要先给 HBase 配置支持创建二级索引

  • 1. 添加如下配置到 HBase 的 Hregionerver 节点的 hbase-site.xml
代码语言:javascript复制
[bigdata@hadoop002 conf]$ vim hbase-site.xml 

<!-- phoenix regionserver 配置参数 -->
<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>
  • 2. 添加如下配置到 HBase 的 Hmaster 节点的 hbase-site.xml
代码语言:javascript复制
<!-- 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>
  • 3. 测试是否支持 准备数据:
代码语言:javascript复制
create table user_1(id varchar primary key, name varchar, addr varchar)

upsert into user_1 values ('1', 'zs', 'beijing');
upsert into user_1 values ('2', 'lisi', 'shanghai');
upsert into user_1 values ('3', 'ww', 'sz');

默认情况下, 只要 rowkey 支持索引(就是上面的 id)

其他字段是不支持索引的:

给 name 字段添加索引:

代码语言:javascript复制
create index idx_user_1 on user_1(name)

注意: 这种索引, 对 name 创建的索引, 则查询的时候也必须只查询 name 字段.

三. Phoenix 创建索引

1. Phoenix 索引分类

  Phoenix 索引分全局索引和局部索引

  • 1. 全局索引

  global index 是默认的索引格式。   适用于多读少写的业务场景。写数据的时候会消耗大量开销,因为索引表也要更新,而索引表是分布在不同的数据节点上的,跨节点的数据传输带来了较大的性能消耗。   在读数据的时候 Phoenix 会选择索引表来降低查询消耗的时间。   如果想查询的字段不是索引字段的话索引表不会被使用,也就是说不会带来查询速度的提升。 创建全局索引的方法:

代码语言:javascript复制
CREATE INDEX my_index ON my_table (my_col)
  • 2.局部索引

  local index 适用于写操作频繁的场景。索引数据和数据表的数据是存放在相同的服务器中的,避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销。   查询的字段不是索引字段索引表也会被使用,这会带来查询速度的提升。   创建局部索引的方法(相比全局索引多了一个关键字 local):

代码语言:javascript复制
CREATE LOCAL INDEX my_index ON my_table (my_index)
  • 3. Local index 和 Global index区别:

  Local index 由于是数据与索引在同一服务器上,所以要查询的数据在哪台服务器的哪个region是无法定位的,只能先找到region然后再利用索引。   Global index 是一种分布式索引,可以直接利用索引定位服务器和region,速度更快,但是由于分布式的原因,数据一旦出现新增变化,分布式的索引要进行跨服务的同步操作,带来大量的通信消耗。所以在写操作频繁的字段上不适合建立Global index。

2. 创建索引总结

  • 1. 创建全局索引, 也支持查询其他字段
代码语言:javascript复制
CREATE INDEX my_index ON my_table (v1) INCLUDE (v2)

SELECT v2 FROM my_table WHERE v1 = 'foo'
  • 2. 创建局部索引
代码语言:javascript复制
CREATE LOCAL INDEX my_index ON my_table (v1)
  • 3. 删除索引
代码语言:javascript复制
DROP INDEX my_index ON my_table

  本次的分享就到这里了

0 人点赞