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