Phoenix构建HBase二级索引案例实战

目录

一、为什么要使用二级索引?

二、全局索引和本地索引

三、可变索引和不可变索引

四、配置HBase支持Phoenix二级索引

五、实战

5.1 在phoenix中创建表

5.2 导入测试数据

5.3 Global Indexing的二级索引测试

5.4 Local Indexing的二级索引测试

5.5 如何确保query查询使用Index

5.6 索引重建

5.7 删除索引

六、索引性能调优


一、为什么要使用二级索引?

对于HBase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询。如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄。

对于较大的表,全表扫描的代价是不可接受的。但是,很多情况下,需要从多个角度查询数据。

  • 例如,在定位某个人的时候,可以通过姓名、身份证号、学籍号等不同的角度来查询

  • 要想把这么多角度的数据都放到rowkey中几乎不可能(业务的灵活性不允许,对rowkey长度的要求也不允许)。

  • 所以需要secondary index(二级索引)来完成这件事。secondary index的原理很简单,但是如果自己维护的话则会麻烦一些。

  • 现在,Phoenix已经提供了对HBase secondary index的支持。

二、全局索引和本地索引

2.1 Global Indexing

  • Global indexing,全局索引,适用于==读多写少==的业务场景。

  • 使用Global indexing在写数据的时候开销很大,因为所有对数据表的更新操作(DELETE, UPSERT VALUES and UPSERT SELECT),都会引起索引表的更新,而索引表是分布在不同的数据节点上的,跨节点的数据传输带来了较大的性能消耗。

  • 在读数据的时候Phoenix会选择索引表来降低查询消耗的时间。

  • 在默认情况下如果想查询的字段不是索引字段的话索引表不会被使用,也就是说不会带来查询速度的提升。

2.2 Local Indexing

  • Local indexing,本地索引,适用于==写操作频繁==以及空间受限制的场景。

  • 与Global indexing一样,Phoenix会自动判定在进行查询的时候是否使用索引。

  • 使用Local indexing时,索引数据和数据表的数据存放在相同的服务器中,这样避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销。

  • 使用Local indexing的时候即使查询的字段不是索引字段索引表也会被使用,这会带来查询速度的提升,这点跟Global indexing不同。对于Local Indexing,一个数据表的所有索引数据都存储在一个单一的独立的可共享的表中。

三、可变索引和不可变索引

3.1 immutable index

  • immutable index,不可变索引,适用于数据==只增加不更新并且按照时间先后顺序存储==(time-series data)的场景,如保存日志数据或者事件数据等。

  • 不可变索引的存储方式是write one,append only。

  • 当在Phoenix使用create table语句时指定IMMUTABLE_ROWS = true表示该表上创建的索引将被设置为不可变索引。

  • 不可变索引分为Global immutable index和Local immutable index两种。

  • Phoenix默认情况下如果在create table时不指定IMMUTABLE_ROW = true时,表示该表为mutable。

3.2 mutable index

  • mutable index,可变索引,适用于数据有==增删改==的场景。

  • Phoenix默认情况创建的索引都是可变索引,除非在create table的时候显式地指定IMMUTABLE_ROWS = true。

  • 可变索引同样分为Global mutable index和Local mutable index两种。

四、配置HBase支持Phoenix二级索引

4.1 修改配置文件

  • 如果要启用phoenix的二级索引功能,需要修改配置文件hbase-site.xml

  • 注意:

  • vim 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>

4.2 重启hbase

  • 完成上述修改后重启hbase集群使配置生效。

五、实战

5.1 在phoenix中创建表

  • 首先,在phoenix中创建一个user table

  • node02执行以下命令,进入phoenix客户端,并创建表

cd /xsluo/install/apache-phoenix-4.14.0-cdh5.14.2-bin/
bin/sqlline.py node01:2181
​
create  table user (
"session_id" varchar(100) not null primary key, 
"f"."cookie_id" varchar(100), 
"f"."visit_time" varchar(100), 
"f"."user_id" varchar(100), 
"f"."age" varchar(100), 
"f"."sex" varchar(100), 
"f"."visit_url" varchar(100), 
"f"."visit_os" varchar(100), 
"f"."browser_name" varchar(100),
"f"."visit_ip" varchar(100), 
"f"."province" varchar(100),
"f"."city" varchar(100),
"f"."page_id" varchar(100), 
"f"."goods_id" varchar(100),
"f"."shop_id" varchar(100)) column_encoded_bytes=0;

5.2 导入测试数据

  • 将事先准备好的 user50w.csv 这个文件上传到node02的/xsluo/install/phoenixsql 这个路径下,该CSV文件中有50万条记录

  • node02执行以下命令,导入50W的测试数据

cd /xsluo/install/apache-phoenix-4.14.0-cdh5.14.2-bin/
bin/psql.py -t USER node01:2181 /xsluo/install/phoenixsql/user50w.csv
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值