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

查詢

相關文章
相關標籤/搜索