Phoneix(三)HBase集成Phoenix建立二级索引

1、Hbase集成Phoneixhtml

一、下载python

在官网http://www.apache.org/dyn/closer.lua/phoenix/中选择提供的镜像站点中下载与安装的HBase版本对应的版本。本地使用的1.2.5,故下载的apache-phoenix-4.13.1-HBase-1.2-bin.tar.gz包。

二、上传并解压sql

tar -zxvf apache-phoenix-4.13.1-HBase-1.2-bin.tar.gz
mv apache-phoenix-4.13.1-HBase-1.2-bin.tar.gz phoenix

三、将phoenix-core-4.13.1-HBase-1.2.jar、phoenix-4.13.1-HBase-1.2-server.jar发送到hregionserver所在的hbase的lib目录下:shell

cp phoenix-core-4.13.1-HBase-1.2.jar /mnt/hbase/lib/
scp phoenix-core-4.13.1-HBase-1.2.jar slave01:/mnt/hbase/lib/
scp phoenix-core-4.13.1-HBase-1.2.jar slave02:/mnt/hbase/lib/
cp phoenix-4.13.1-HBase-1.2-server.jar /mnt/hbase/lib/
scp phoenix-4.13.1-HBase-1.2-server.jar slave02:/mnt/hbase/lib/
scp phoenix-4.13.1-HBase-1.2-server.jar slave01:/mnt/hbase/lib/

四、重启Hbaseapache

start-hbase.sh

五、启动phoneix服务器

# 进入phoenix下的bin目录
cd phoenix/bin
# 用python2.x启动
python2 sqlline.py matser

六、建立一张简单的 表测试网络

0: jdbc:phoenix:master> create table user(id varchar primary key,name varchar,age varchar,phone varchar,email varchar);
No rows affected (1.47 seconds)

七、插入数据oop

upsert into user values('1001','caocao','26','13800000000','caocao@163.com');
upsert into user values('1002','liubei','24','13800000001','liubei@163.com');
upsert into user values('1003','guanyu','23','13800000002','guanyu@163.com');
upsert into user values('1004','zhangfei','22','13800000003','zhangfei@163.com');
upsert into user values('1005','sunquan','20','13800000004','sunquan@163.com');

八、经过hbase shell查看性能

所以配置完成了。。。测试

2、Phoneix集成Hbase建立二级索引

索引最经常使用的三个类型:覆盖索引、全局索引、本地索引

一、配置(若是使用的phoneix版本在4.8以后则不须要以下配置,我这里使用的是4.13所以不须要配置)

在每个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>
<property>
<name>hbase.coprocessor.regionserver.classes</name>
<value>org.apache.hadoop.hbase.regionserver.LocalIndexMerger</value>
</property>

在每个Master的hbase-site.xml中加入以下的属性(phoneix版本在4.8以后不用添加):

<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

二、使用phoneix建立表、导入数据(数据量10W条)

https://www.cnblogs.com/yfb918/p/10895754.html

三、覆盖索引(Covered Indexes)

说明:只须要经过索引就能返回所要查询的数据,因此索引的列必须包含所需查询的列(select 的列和where的列)

3.1不带索引的查询,查询ip='139.204.122.144'(普通查询)

因为数据量不大,通过屡次查询,查询时间在0.13s-0.150s左右

3.1.1查询计划

由图看出该执行过程线进行了full scan(全表扫描)再经过Filter(过滤器)进行筛选数据。

3.2建立基于ID的覆盖索引并绑定IP列上的数据

CREATE INDEX COVERINDEX ON TEST(ID) INCLUDE(IP)

当我要经过ID来查询IP时就直接能够从索引上取回数据而无需先获得索引再去数据表中查询数据

查询语句:

说明:这里ID=''94676"正是上面IP=‘139.204.122.144’的该条数据

SElECT IP FROM TEST WHERE ID='94676';

 通过屡次查询:耗时在:0.016s-0.02s左右

 3.2.1查询计划

3.3测试后删除索引

 

四、全局索引(Global Indexes)

全局索引适用于多读少写的场景,在写操做上会给性能带来极大的开销,由于全部的更新和写操做都会引发索引的更新,在读取数据时,Phoneix将经过索引表达式来快速查询结果。

在使用全局索引以前须要在每一个RegionServer上的hbase-site.xml添加以下属性:

<property>
   <name>hbase.regionserver.wal.codec</name>
   <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>

4.1这里在IP字段上建立索引

CREATE INDEX IPINDEX ON TEST(IP);

如下查询才会使用到索引

下面这个是采用强制索引的方式:

 

如下查询不会使用到索引

 语句一:
select IP,BROWER from TEST where IP='139.204.122.144';
虽然IP是索引字段,可是BROWER不是索引字段,因此不会使用到索引
 语句二:
select BROWER from TEST where IP='139.204.122.144';
BROWER不是索引字段,其余同理

可是使用如下几种方式,执行查询语句二时也将使用到索引

a、建立包含字段BROWER的覆盖索引

CREATE INDEX BROWERINDEX ON TEST(IP) INCLUDE(BROWER);

b、强制使用索引

 SELECT /*+ INDEX(INDEXIP,IPINDEX) */ IP FROM TEST WHERE IP='139.204.122.144';
若是IP是索引字段,那么就会直接从索引表中查询
   若是IP不是索引字段,那么将会进行全表扫描,因此当用户明确知道表中数据较少且符合检索条件时才适用,此时的性能才是最佳的。

c、使用本地索引

CREATE LOCAL INDEX BROWERINDEX ON CSVTABLES(BROWER);

 

五、本地索引(Local indexes)

 本地索引适用于写多读少,空间有限的场景,和全局索引同样,Phoneix在查询时会自动选择是否使用本地索引,使用本地索引,为避免进行写操做所带来的网络开销,索引数据和表数据都存放在相同的服务器中,当查询的字段不彻底是索引字段时本地索引也会被使用,与全局索引不一样的是,全部的本地索引都单独存储在同一张共享表中,因为没法预先肯定Region的位置,因此在读取数据时会检查每一个Region上的数据于是带来必定性能开销。

在使用本地索引以前须要在hbase master的hbase-site.xml上添加一下配置:

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

建立本地索引

CREATE LOCAL INDEX IPINDEX ON TEST(IP);

查询

相关文章
相关标签/搜索