1.准备

大家可以从官网上下载与HBase版本对应的Phoenix版本。对应到HBase 2.1,应该使用版本「5.0.0-HBase-2.0」。
http://phoenix.apache.org/download.html

2安装

  1. tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz -C /export/server/
  2. 2. phoenix的所有jar包添加到所有HBase RegionServerMaster的复制到HBaselib目录
  3. cp phoenix*.jar /export/server/hbase-2.1.0/lib/
  4. vim hbase-site.xml
  5. # 1. 将以下配置添加到 hbase-site.xml 后边
  6. <!-- 支持HBase命名空间映射 -->
  7. <property>
  8. <name>phoenix.schema.isNamespaceMappingEnabled</name>
  9. <value>true</value>
  10. </property>
  11. <!-- 支持索引预写日志编码 -->
  12. <property>
  13. <name>hbase.regionserver.wal.codec</name>
  14. <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
  15. </property>
  16. 4. 将配置后的hbase-site.xml拷贝到phoenixbin目录
  17. cp hbase-site.xml /export/server/phoenix-5.0.0-HBase-2.0/bin/
  18. 5.配置环境变量
  19. export PHOENIX_HOME=/export/server/phoenix-5.0.0-HBase-2.0
  20. export PHOENIX_CLASSPATH=$PHOENIX_HOME
  21. export PATH=$PATH:$PHOENIX_HOME/bin
  22. 6.建立连接
  23. bin/sqlline.py node1,node2,node3:2181

注意phoenix中默认小写回转为大写如果想写小写请使用”” 号,使用是也必须是”” 号,建议使用大写另外需要注意的是insert 数据字符串要用’ ‘号

3常见命令

  1. !table
  2. 1.建表
  3. create table if not exists t_order(
  4. id varchar(20) primary key,
  5. C1.status varchar(10),
  6. C1.money float,
  7. C1.pay_way integer,
  8. C1.user_id varchar(10)
  9. );
  10. upsert into t_order(id,status,money) values ('111','1',220.0);
  11. delete from t_order where id='8888';
  12. select * from t_order;
  13. 分页查询
  14. select * from t_order limit 3 offset 2; #offset 起始索引 limit 后面是查询数量

4phoenix预分区

  1. 1预分区方式 #注意压缩方式字母必须大写否则不生效
  2. create table if not exists t_order(
  3. id varchar(20) primary key,
  4. C1.status varchar(10),
  5. C1.money float,
  6. C1.pay_way integer,
  7. C1.user_id varchar(10)
  8. )
  9. COMPRESSION='GZ',
  10. split on ('1','2','3');
  11. 2.加盐hash方式
  12. create table if not exists t_order(
  13. id varchar(20) primary key,
  14. C1.status varchar(10),
  15. C1.money float,
  16. C1.pay_way integer,
  17. C1.user_id varchar(10)
  18. )
  19. COMPRESSION='GZ',
  20. salt_buckets=5;
  21. 加盐就在是rowkey的开头加0X* 通过phoenix查询时会自动去盐

5.phoenix视图

通过非Phoenix创建的表,phoenix看不到,所以如果想在phoenix中操作的话需要创建视图。

  1. #小写需要加 "" 号,大写可以不处理
  2. create view "momo"."region_test" (
  3. rowkey varchar primary key,
  4. "cf1"."name" varchar(20));
  5. create view water_bill(
  6. C1.LATEST_DATE varchar(10),
  7. C1.NAME varchar(10),
  8. C1.NUM_CURRENT varchar(10),
  9. C1.NUM_PREVIOUS varchar(10),
  10. C1.NUM_USAGE varchar(10),
  11. C1.PAY_DATE varchar(10),
  12. C1.RECORD_DATE varchar(10),
  13. C1.SEX varchar(10),
  14. C1.TOTAL_MONEY integer
  15. );

6.Phoenix二级索引

6.1索引的分类

  1. 全局索引: phoenix会单独创建一个索引表。因此适合多读少些。索引表和目标表有相同的region数。查询时只能有索引字段出现非索引字段索引失效

语法: create index 索引名称 on 表名(列名1, 列名2 ….)

  1. 本地索引:不会单独创建一个索引表,索引数据直接放置到数据中,适合写多场景。查询时只要查询的字段中存在索引字段就可以生效,加盐分区会造成索引失效

语法:create local index 索引名称 on 表名(列名1, 列名2 ….)

  1. 覆盖索引:可以为表中任意字段创建索引,建立索引后该数据将在索引字段后有效减少去主表查询。但是会浪费空间,因为在索引字段后所以依赖本地索引或者全局索引

    1. 语法:create [local] index my_index on 目标表(列1,列2...) include(覆盖索引列....)
  2. 函数索引:准对函数的结果创建索引当我们使用这个函数时直接返回结果

语法:create index 索引名称 on 表名(函数)

6.2索引使用案例

6.2.1全局索引+覆盖索引

  1. #只创建user_id 字段全局索引 发现explain 查询任然时全表扫描
  2. create index ORDER_DTL_INDEX_ID on order_dtl(user_id);
  3. #删除索引
  4. drop index ORDER_DTL_INDEX_ID on order_dtl;
  5. #重新创建cluser_id 的全局索引并且传经id, money的覆盖索引,再次explain 发现变为RANGE SCAN
  6. create index ORDER_DTL_INDEX_ID on order_dtl(user_id)include(id, money);

6.2.2本地索引

在未来可能会根据表中 订单ID, 订单状态, 支付金额, 支付方式, 用户ID查询数据,由于字段较多因此建立本地索引较为合适

  1. create local index local_index_order_dtl on order_dtl(id,status,money,pay_way,user_id);
  2. explain select user_id,category from order_dtl where user_id='3107867';
  3. explain select user_id,category from order_dtl where status='已支付';