Phoenix实践——Phoenix配置支持二级索引和使用小记
Posted 扫地增
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Phoenix实践——Phoenix配置支持二级索引和使用小记相关的知识,希望对你有一定的参考价值。
支持配置:
phoenix
的二级索引需要配置进行实现,步骤如下:增加配置不会报错,报错请考虑是版本监控问题。
1、HMaster配置
在
HMaster
节点的$HBASE_HOME/conf/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>
2、HRegionserver配置
在每个
HRegionserver
节点上的$HBASE_HOME/conf/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>
重启服务
重启
hbase
和phoenix
。
二级索引:
索引分类:
全局索引(global index)
全局索引是
phoenix
默认的索引格式。
特点:
适用于多读少写的业务场景。写数据的时候会消耗大量开销,因为索引表也要更新,而索引表是分布在不同的数据节点上的,跨节点的数据传输带来了较大的性能消耗。在读数据的时候Phoenix
会选择索引表来降低查询消耗的时间。如果想查询的字段不是索引字段的话索引表不会被使用,也就是说不会带来查询速度的提升。
这里我们还是使用phoenix_table_mapping_user_info_test2
,现在没有数据我们导入:
upsert into "phoenix_table_mapping_user_info_test2" values ('1002','Si','Li','aiyunxiao','北京朝阳');
upsert into "phoenix_table_mapping_user_info_test2" values ('1001','San','Zhang','aiyunxiao','北京朝阳');
查询并分析执行计划:
我们给company.name
创建全局索引如下:
create index my_index on "phoenix_table_mapping_user_info_test2"("company"."name");
强制索引
select /*+ index(items my_index) */ *
from items
where price=0.8824734;
drop index my_name on usertable;
覆盖索引
覆盖索引
Covered Indexes
,需要include
包含需要返回数据结果的列。
create index index1_c on hao1
(
age
)
include(name); --name已经被缓存在这张索引表里了。
--对于
select name from hao1 where age=2 --查询效率和速度最快
select * from hao1 where age =2 --其他列不在索引表内,会全表扫描
本地索引(Local Index)
特点:
Local index
适用于写操作频繁的场景。索引数据和数据表的数据是存放在相同的服务器中的,避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销。查询的字段不是索引字段索引表也会被使用,这会带来查询速度的提升。
我们创建一张新表phoenix_table_mapping_user_info_test3
并准备好数据:
create table "phoenix_table_mapping_user_info_test3"
(
user_id varchar primary key,
"name"."firstname" varchar,
"name"."lastname" varchar,
"company"."name" varchar,
"company"."address" varchar
)
column_encoded_bytes=0;
--数据插入
upsert into "phoenix_table_mapping_user_info_test3" values ('1002','Si','Li','aiyunxiao','北京朝阳');
upsert into "phoenix_table_mapping_user_info_test3" values ('1001','San','Zhang','aiyunxiao','北京朝阳');
创建本地索引:
create local index my_local_index on "phoenix_table_mapping_user_info_test3"
(
"company"."address"
);
相比上面的查询来说性能快了一倍
我们来看执行计划:
异步创建索引
异步创建索引,创建的索引表中不会有数据,单独使用命令行工具来执行数据的创建
--异步索引创建
create index index1_c on hao1
(
age
)
include(name) async;
hbase org.apache.phoenix.mapreduce.index.indextool --schema my_schema --data-table my_table --index-table async_idx --output-path async_idx_hfiles
索引删除:
drop index my_index ON "phoenix_table_mapping_user_info_test1";
以上是关于Phoenix实践——Phoenix配置支持二级索引和使用小记的主要内容,如果未能解决你的问题,请参考以下文章
Phoenix&HBase实践——Phoenix+HBase结合实践操作总结
Spark 实战系列Phoenix 整合 spark 进行查询分析