Hbase的SQL中间层——Phoenix
本文于1828天之前发表,文中内容可能已经过时。
一、Phoenix简介
Phoenix
是HBase的开源SQL中间层,它允许你使用标准JDBC的方式来操作HBase上的数据。在Phoenix
之前,如果你要访问HBase,只能调用它的Java API,但相比于使用一行SQL就能实现数据查询,HBase的API还是过于复杂。Phoenix
的理念是we put sql SQL back in NOSQL
,即你可以使用标准的SQL就能完成对HBase上数据的操作。同时这也意味着你可以通过集成Spring Data JPA
或Mybatis
等常用的持久层框架来操作HBase。
其次Phoenix
的性能表现也非常优异,Phoenix
查询引擎会将SQL查询转换为一个或多个HBase Scan,通过并行执行来生成标准的JDBC结果集。它通过直接使用HBase API以及协处理器和自定义过滤器,可以为小型数据查询提供毫秒级的性能,为千万行数据的查询提供秒级的性能。同时Phoenix还拥有二级索引等HBase不具备的特性,因为以上的优点,所以Phoenix
成为了HBase最优秀的SQL中间层。

二、Phoenix安装
我们可以按照官方安装说明进行安装,官方说明如下:
- download and expand our installation tar
- copy the phoenix server jar that is compatible with your HBase installation into the lib directory of every region server
- restart the region servers
- add the phoenix client jar to the classpath of your HBase client
- download and setup SQuirrel as your SQL client so you can issue adhoc SQL against your HBase cluster
2.1 下载并解压
官方针对Apache版本和CDH版本的HBase均提供了安装包,按需下载即可。官方下载地址: http://phoenix.apache.org/download.html
1 | 下载 |
2.2 拷贝Jar包
按照官方文档的说明,需要将phoenix server jar
添加到所有Region Servers
的安装目录的lib
目录下。
这里由于我搭建的是HBase伪集群,所以只需要拷贝到当前机器的HBase的lib目录下。如果是真实集群,则使用scp命令分发到所有Region Servers
机器上。
1 | cp /usr/app/apache-phoenix-4.14.0-cdh5.14.2-bin/phoenix-4.14.0-cdh5.14.2-server.jar /usr/app/hbase-1.2.0-cdh5.15.2/lib |
2.3 重启 Region Servers
1 | 停止Hbase |
2.4 启动Phoenix
在Phoenix解压目录下的bin
目录下执行如下命令,需要指定Zookeeper的地址:
- 如果HBase采用Standalone模式或者伪集群模式搭建,则默认采用内置的 Zookeeper服务,端口为2181;
- 如果是HBase是集群模式并采用外置的Zookeeper集群,则按照自己的实际情况进行指定。
1 | ./sqlline.py hadoop001:2181 |
2.5 启动结果
启动后则进入了Phoenix交互式SQL命令行,可以使用!table
或!tables
查看当前所有表的信息

三、Phoenix 简单使用
3.1 创建表
1 | CREATE TABLE IF NOT EXISTS us_population ( |

新建的表会按照特定的规则转换为HBase上的表,关于表的信息,可以通过Hbase Web UI 进行查看:

3.2 插入数据
Phoenix 中插入数据采用的是UPSERT
而不是INSERT
,因为Phoenix并没有更新操作,插入相同主键的数据就视为更新,所以UPSERT
就相当于UPDATE
+INSERT
1 | UPSERT INTO us_population VALUES('NY','New York',8143197); |
3.3 修改数据
1 | -- 插入主键相同的数据就视为更新 |

3.4 删除数据
1 | DELETE FROM us_population WHERE city='Dallas'; |

3.5 查询数据
1 | SELECT state as "州",count(city) as "市",sum(population) as "热度" |

3.6 退出命令
1 | !quit |
3.7 扩展
从上面的操作中可以看出,Phoenix支持大多数标准的SQL语法。关于Phoenix支持的语法、数据类型、函数、序列等详细信息,因为涉及内容很多,可以参考其官方文档,官方文档上有详细的说明:
语法(Grammar) :https://phoenix.apache.org/language/index.html
函数(Functions) :http://phoenix.apache.org/language/functions.html
数据类型(Datatypes) :http://phoenix.apache.org/language/datatypes.html
序列(Sequences) :http://phoenix.apache.org/sequences.html
联结查询(Joins) :http://phoenix.apache.org/joins.html
四、Phoenix Java API
因为Phoenix遵循JDBC规范,并提供了对应的数据库驱动PhoenixDriver
,这使得采用Java语言对其进行操作的时候,就如同对其他关系型数据库一样,下面给出基本的使用示例。
4.1 引入Phoenix core JAR包
如果是maven项目,直接在maven中央仓库找到对应的版本,导入依赖即可:
1 | <!-- https://mvnrepository.com/artifact/org.apache.phoenix/phoenix-core --> |
如果是普通项目,则可以从Phoenix解压目录下找到对应的JAR包,然后手动引入:

4.2 简单的Java API实例
1 | import java.sql.Connection; |
结果如下:

实际的开发中我们通常都是采用第三方框架来操作数据库,如mybatis
,Hibernate
,Spring Data
等。关于Phoenix与这些框架的整合步骤参见下一篇文章:Spring/Spring Boot + Mybatis + Phoenix