Phoneix(三)HBase集成Phoenix創建二級索引


一、Hbase集成Phoneix

1、下載

在官網http://www.apache.org/dyn/closer.lua/phoenix/中選擇提供的鏡像站點中下載與安裝的HBase版本對應的版本。本地使用的1.2.5,故下載的apache-phoenix-4.13.1-HBase-1.2-bin.tar.gz包。

2、上傳並解壓

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

3、將phoenix-core-4.13.1-HBase-1.2.jar、phoenix-4.13.1-HBase-1.2-server.jar發送到hregionserver所在的hbase的lib目錄下:

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/

4、重啟Hbase

start-hbase.sh

5、啟動phoneix

# 進入phoenix下的bin目錄
cd phoenix/bin
# 啟動
./sqlline.py master:2181

6、創建一張簡單的 表測試

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)

7、插入數據

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

8、通過hbase shell查看

因此配置完成了。。。

二、Phoneix集成Hbase創建二級索引

索引最常用的三個類型:覆蓋索引、全局索引、本地索引

1、配置(如果使用的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

2、使用phoneix創建表、導入數據(數據量10W條)

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

3、覆蓋索引(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測試后刪除索引

 

4、全局索引(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);

 

5、本地索引(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);

查詢

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM