一、Phoenix的介绍
作用:提供SQL的方式操作HBase中数据,并对HBase进行了优化,提供了索引等操作。
二、Phoenix的安装
1. 上传并解压安装包
2. 将Phoenix的服务包拷贝到各个HBase的lib目录下
3. 修改HBase的配置文件
cd /export/server/hbase/conf/
vim hbase-site.xml
------
# 1. 将以下配置添加到 hbase-site.xml
<!-- 支持HBase命名空间映射 -->
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
<!-- 支持索引预写日志编码 -->
<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
# 2. 将hbase-site.xml分发到每个节点
scp hbase-site.xml node2.itcast.cn:$PWD
scp hbase-site.xml node3.itcast.cn:$PWD
# 3. 将配置后的hbase-site.xml拷贝到phoenix的bin目录
cp /export/server/hbase/conf/hbase-site.xml /export/server/phoenix/bin
4. 重启HBase集群
5. 连接Phoenix客户端
cd /export/server/phoenix/bin
./sqlline.py
三、基本使用
1. 创建表
create table if not exists "order_dtl"(
id varchar primary key,
C1.status varchar,
C1."money" integer,
C2.pay_way integer,
"c1"."user_id" integer,
"c2".operation_time varchar,
c2.category varchar
);
2. 添加/修改数据
upsert into order_dtl values('rk01','已提交',4070,1,4944191,'2020-04-25 12:09:16','手机');
upsert into order_dtl values('rk02','已完成',4350,1,1625615,'2020-04-25 12:09:37','家用电器;电脑');
3. 查询操作:与SQL一致,仅支持单表的操作不支持子查询join操作
四、预分区
可以在建表的时候指定多个Region
- 手动方式
- Hash加盐
五、视图
作用:在HBase上创建的表在Phoenix中无法查看,可以通过视图进行映射,在Phoenix中操作不是基于Phoenix创建的表
六、二级索引
在HBase中仅支持rowkey构建索引,对于其他字段不支持索引操作,因此根据其他字段检索时都是全局scan扫描操作。Phoenix提供针对HBase表中各个字段构建索引来提升查询性能。
- 全局索引:指的在创建索引的时候,会单独的形成一张索引表,索引表于目标表拥有相同的Region数量,这样当查询数据的时候,先查询索引表,然后根据索引表的查询的结果,再到目标表中检索对应数据即可。
- 覆盖索引:覆盖索引一般无法单独使用,一般都是结合全局索引来进行使用,覆盖索引主要将对应索引字段数据放置在全局索引的后面。比如说: 对A字段构建全局索引,对B字段构建覆盖索引,此时B字段的原始数据会被放置到A字段索引的背后。
create index order_dtl_index on order_dtl_2(status) include(id,money);
- 本地索引:指的创建本地索引的时候,不会单独的构建一张索引表,索引数据和目标表所有字段放置在一起,在查询数据的时候,只要SQL中存在本地索引的字段,本地索引就会生效。因为索引数据和原始数据放置在同一个表中,这样在写入数据的时候,直接对索引数据进行修改操作,不需要额外进行写入操作,对写入效率影响不大。
create local index order_dtl_local_index on order_dtl_2(id,status,money,pay_way,user_id);