Phoenix基础使用
Phoenix 是构建在 HBase 之上的 SQL 查询引擎,允许用户使用标准 SQL 语句读写 HBase 表。Phoenix 会将 SQL 编译为一系列 HBase 原生 API 调用,并借助协处理器(Coprocessor)和自定义过滤器在服务端并行执行,从而在保留 HBase 高并发、低延迟特性的同时,大幅降低使用门槛。对于简单查询可达到毫秒级响应,对于百万级行数的查询性能可达秒级。
BMR HBase 集群已默认集成 Phoenix 客户端,无需额外安装即可使用。本文介绍如何在 BMR 上通过 Phoenix 使用 SQL 读写 HBase 表。
说明:BMR 2.4.18 及以上版本的 HBase 集群支持社区 HBase 2.4.18,并默认集成 Phoenix 组件。不同 BMR 版本对应支持的 HBase 与 Phoenix 组件版本不同,具体支持版本以创建集群时可选服务中的组件版本为准。
应用场景
- SQL 化访问 HBase:使用标准 SQL 完成对 HBase 表的建表、增删改查,降低 NoSQL 使用门槛。
- 交互式数据分析:结合 BI 工具或应用程序,通过 Phoenix JDBC 对 HBase 中的海量数据进行交互式分析。
- 二级索引查询:通过 Phoenix 创建二级索引,加速非行键(RowKey)条件的查询。
说明:二级索引功能默认不开启,如果用户需要开启,需要自行配置 hbase-site.xml 中修改 hbase.regionserver.wal.codec 配置项的值为 org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec,并重启 Hbase 服务。
前提条件
- 已创建 HBase 类型集群,且集群版本为 BMR HBase 2.4.18 及以上。创建集群详情请参考创建集群。
- 已获取集群 Master 节点的登录方式(内网 IP、绑定 EIP 或 VNC 控制台登录),SSH 登录方式请参考SSH连接到集群。
启动 Phoenix 客户端
- SSH 登录集群 Master 节点,参考SSH连接到集群。
- 执行以下命令,切换到 hdfs 用户:
1su hdfs
- 执行以下命令,进入 Phoenix 客户端目录:
1cd /opt/bmr/phoenix/bin
- 执行以下命令,启动 Phoenix 交互式命令行工具:
1./sqlline.py
启动成功后进入 SQL 交互式命令行,提示符为 0: jdbc:phoenix:>,即可执行 SQL 语句。
说明:
sqlline.py默认连接本集群的 Zookeeper。如需显式指定 Zookeeper 地址,可执行./sqlline.py $zookeeper_quorum:$clientPort,其中$zookeeper_quorum与$clientPort的取值可从/opt/bmr/hbase/conf/hbase-site.xml中的hbase.zookeeper.quorum和hbase.zookeeper.property.clientPort配置项获取。
通过 Phoenix 读写 HBase 表
进入 Phoenix 命令行后,可使用标准 SQL 完成对 HBase 表的常见操作。
创建表
1CREATE TABLE IF NOT EXISTS TEST (
2 host CHAR(50) NOT NULL,
3 txn_count BIGINT
4 CONSTRAINT pk PRIMARY KEY (host)
5);
说明:Phoenix 中的表名与列名默认会转换为大写,若需保留大小写,请使用双引号包裹(如
"MyTable")。表的主键(PRIMARY KEY)对应 HBase 表的 RowKey。
写入数据
Phoenix 使用 UPSERT 语句写入数据,语义为「存在则更新,不存在则插入」:
1UPSERT INTO TEST(host, txn_count) VALUES('192.168.1.1', 1);
2UPSERT INTO TEST(host, txn_count) VALUES('192.168.1.2', 2);
查询数据
1SELECT * FROM TEST;
执行结果示例:
1+--------------+------------+
2| HOST | TXN_COUNT |
3+--------------+------------+
4| 192.168.1.1 | 1 |
5| 192.168.1.2 | 2 |
6+--------------+------------+
72 rows selected
删除表
1DROP TABLE IF EXISTS TEST;
退出客户端
1!quit
使用示例
以下示例演示通过 Phoenix 创建一张统计各主机访问次数的表,并完成写入与查询。
- 启动 Phoenix 客户端:
1su hdfs
2cd /opt/bmr/phoenix/bin/
3./sqlline.py
- 创建表并写入数据:
1CREATE TABLE IF NOT EXISTS WEB_STAT (
2 host CHAR(50) NOT NULL,
3 domain VARCHAR NOT NULL,
4 pv BIGINT
5 CONSTRAINT pk PRIMARY KEY (host, domain)
6);
7
8UPSERT INTO WEB_STAT(host, domain, pv) VALUES('web01', 'example.com', 120);
9UPSERT INTO WEB_STAT(host, domain, pv) VALUES('web02', 'example.com', 85);
- 查询与聚合分析:
1SELECT domain, SUM(pv) AS total_pv FROM WEB_STAT GROUP BY domain;
相关操作
验证 Phoenix 表与 HBase 表的对应关系
通过 Phoenix 创建的表可在 HBase Shell 中查看,两者操作的是同一份底层数据。
- 执行以下命令进入 HBase Shell:
1hbase shell
- 查看 Phoenix 创建的表:
1list
注意:Phoenix 对表结构(Schema)有额外的元数据管理。建议对同一张表统一通过 Phoenix 进行读写操作,避免直接使用 HBase API 修改 Phoenix 表结构导致元数据不一致。
注意事项
- BMR HBase 集群仅支持 VPC 网络访问,请确保客户端与集群处于同一 VPC 或已打通网络。
- Phoenix 的主键列(PRIMARY KEY)不允许为空,且主键顺序影响底层 RowKey 的组织方式,请根据查询模式合理设计主键。
- 对于非主键列的高频条件查询,建议通过 Phoenix 创建二级索引以提升查询性能。
- 更多 SQL 语法与函数请参考 Apache Phoenix 官方文档。
评价此篇文章
