专栏首页不温卜火Phoenix快速入门系列(3) | 一文教你如何在Phoenix中创建 HBase 二级索引

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

一. 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
[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
<!-- 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. 测试是否支持 准备数据:
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 字段添加索引:

create index idx_user_1 on user_1(name)

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

三. Phoenix 创建索引

1. Phoenix 索引分类

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

  • 1. 全局索引

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

CREATE INDEX my_index ON my_table (my_col)
  • 2.局部索引

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

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. 创建全局索引, 也支持查询其他字段
CREATE INDEX my_index ON my_table (v1) INCLUDE (v2)

SELECT v2 FROM my_table WHERE v1 = 'foo'
  • 2. 创建局部索引
CREATE LOCAL INDEX my_index ON my_table (v1)
  • 3. 删除索引
DROP INDEX my_index ON my_table

  本次的分享就到这里了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spark内核详解 (5) | Spark的任务调度机制

    在上一篇博文中我们讲解了 Spark YARN-Cluster 模式下的任务提交流程,但是我们并没有具体说明 Driver 的工作流程, Driver 线程主要...

    不温卜火
  • MapReduce快速入门系列(4) | Hadoop序列化

    序列化:把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输。 反序列化:将收到字节序列(或其他数据传输协议)或者是磁盘的...

    不温卜火
  • Spark Core快速入门系列(11) | 文件中数据的读取和保存

      从文件中读取数据是创建 RDD 的一种方式.   把数据保存的文件中的操作是一种 Action.   Spark 的数据读取及数据保存可以从两个维度...

    不温卜火
  • 技术分享 | 常见索引问题处理

    数据库技术爱好者,爱可生 DBA 团队成员,负责 MySQL 日常问题处理以及数据库运维平台的问题排查,擅长 MySQL 主从复制及优化,喜欢钻研技术问题,还有...

    爱可生开源社区
  • 聚集索引VS非聚集索引

    悟空聊架构
  • 聚集索引VS非聚集索引

    悟空聊架构
  • SQL优化总结之一

    Kevin_Zhang
  • 数据库优化面试题

    在 DB2 数据库中索引采用的是 B+ 树的结构,索引的叶子节点上包含索引键的值和一个指向数据地址的指针。DB2 先查询索引,然后通过索引里记录的指针,直接访问...

    lyb-geek
  • 【Oracle】-【索引】先查数据再建索引,还是先建索引再插数据?

    1、新建一个表结构,创建索引,将百万或千万级的数据使用insert导入该表。 2、新建一个表结构,将百万或千万级的数据使用isnert导入该表,再创建索引。 ...

    bisal
  • mysql索引的类型和优缺点

    现在来介绍了数据库索引,及其优、缺点。针对MySQL索引的特点、应用进行了详细的描述。分析了如何避免MySQL无法使用,如何使用EXPLAIN分析查询语句,如何...

    wangxl

扫码关注云+社区

领取腾讯云代金券