1. Phoenix簡介
1.1 Phoenix定義
Phoenix是HBase的開源SQL皮膚??梢允褂脴藴蔎DBC API代替HBase客戶端API來創(chuàng)建表,插入數據和查詢HBase數據。
1.2 Phoenix特點
1) 容易集成:如Spark,Hive,Pig,F(xiàn)lume和Map Reduce。
2) 性能好:直接使用HBase API以及協(xié)處理器和自定義過濾器,可以為小型查詢提供毫秒級的性能,或者為數千萬行提供數秒的性能。
3) 操作簡單:DML命令以及通過DDL命令創(chuàng)建表和版本化增量更改。
4) 安全功能: 支持GRANT和REVOKE 。
5) 完美支持Hbase二級索引創(chuàng)建。
2. Phoenix創(chuàng)建Hbase二級索引
2.1 配置Hbase支持Phoenix創(chuàng)建二級索引
2.1.1 添加如下配置到Hbase的Hregionserver節(jié)點的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>? ?
2.1.2 添加如下配置到Hbase中Hmaster節(jié)點的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.1.3 常見問題匯總:
1)注意:網上配置文檔里有這一條,但在實際測試中(測試環(huán)境hbase-1.3.1,網上0.98.6),加入該條的regionserver會在hbase啟動時失敗,對應節(jié)點上沒有HregionServer進程,去掉該配置后正常啟動,且能正常創(chuàng)建local index。
<property>
? ? <name>hbase.coprocessor.regionserver.classes</name>
? ? <value>org.apache.hadoop.hbase.regionserver.LocalIndexMerger</value>?
</property>?
2)hbase-site.xml的zookeeeper的配置信息不能加2181,否則在創(chuàng)建local index的時候會報以下異常:

正常配置:
<property>
? ? <name>hbase.zookeeper.quorum</name>? ? ?
? ? <value>hadoop101,hadoop102,hadoop103</value>?
</property>?
2.2 創(chuàng)建索引
2.2.1 phoenix的索引分類
1)global index是默認的索引格式。適用于多讀少寫的業(yè)務場景。寫數據的時候會消耗大量開銷,因為索引表也要更新,而索引表是分布在不同的數據節(jié)點上的,跨節(jié)點的數據傳輸帶來了較大的性能消耗。在讀數據的時候Phoenix會選擇索引表來降低查詢消耗的時間。如果想查詢的字段不是索引字段的話索引表不會被使用,也就是說不會帶來查詢速度的提升。
CREATE INDEX my_index ON my_table (my_index)?
2)Local index適用于寫操作頻繁的場景。索引數據和數據表的數據是存放在相同的服務器中的,避免了在寫操作的時候往不同服務器的索引表中寫索引帶來的額外開銷。查詢的字段不是索引字段索引表也會被使用,這會帶來查詢速度的提升。
? CREATE LOCAL INDEX my_index ON my_table (my_index)?
2.2.2 三種提升效率查詢方式
1) CREATE INDEX my_index ON my_table (v1) INCLUDE (v2)
2) SELECT /*+ INDEX(my_table? my_index) */ v2 FROM my_table WHERE v1 = 'foo'
3) CREATE LOCAL INDEX my_index? ON my_table (v1)
2.2.3 如何刪除索引
DROP INDEX my_index ON my_table