HBase 系列(十)—— HBase的SQL中间层 Phoenix

释放双眼,带上耳机,听听看~!

一、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
3
4
5
6
1# 下载
2wget http://mirror.bit.edu.cn/apache/phoenix/apache-phoenix-4.14.0-cdh5.14.2/bin/apache-phoenix-4.14.0-cdh5.14.2-bin.tar.gz
3# 解压
4tar tar apache-phoenix-4.14.0-cdh5.14.2-bin.tar.gz
5
6

2.2 拷贝Jar包

按照官方文档的说明,需要将phoenix server jar添加到所有Region Servers的安装目录的lib目录下。

这里由于我搭建的是HBase伪集群,所以只需要拷贝到当前机器的HBase的lib目录下。如果是真实集群,则使用scp命令分发到所有Region Servers机器上。


1
2
3
1cp /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

2.3 重启 Region Servers


1
2
3
4
5
6
1# 停止Hbase
2stop-hbase.sh
3# 启动Hbase
4start-hbase.sh
5
6

2.4 启动Phoenix

在Phoenix解压目录下的bin目录下执行如下命令,需要指定Zookeeper的地址:

  • 如果HBase采用Standalone模式或者伪集群模式搭建,则默认采用内置的 Zookeeper服务,端口为2181;

  • 如果是HBase是集群模式并采用外置的Zookeeper集群,则按照自己的实际情况进行指定。


1
2
3
1# ./sqlline.py hadoop001:2181
2
3

2.5 启动结果

启动后则进入了Phoenix交互式SQL命令行,可以使用!table或!tables查看当前所有表的信息

三、Phoenix 简单使用

3.1 创建表


1
2
3
4
5
6
7
1CREATE TABLE IF NOT EXISTS us_population (
2      state CHAR(2) NOT NULL,
3      city VARCHAR NOT NULL,
4      population BIGINT
5      CONSTRAINT my_pk PRIMARY KEY (state, city));
6
7

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

3.2 插入数据

Phoenix 中插入数据采用的是UPSERT而不是INSERT,因为Phoenix并没有更新操作,插入相同主键的数据就视为更新,所以UPSERT就相当于UPDATE+INSERT


1
2
3
4
5
6
7
8
9
10
11
12
1UPSERT INTO us_population VALUES('NY','New York',8143197);
2UPSERT INTO us_population VALUES('CA','Los Angeles',3844829);
3UPSERT INTO us_population VALUES('IL','Chicago',2842518);
4UPSERT INTO us_population VALUES('TX','Houston',2016582);
5UPSERT INTO us_population VALUES('PA','Philadelphia',1463281);
6UPSERT INTO us_population VALUES('AZ','Phoenix',1461575);
7UPSERT INTO us_population VALUES('TX','San Antonio',1256509);
8UPSERT INTO us_population VALUES('CA','San Diego',1255540);
9UPSERT INTO us_population VALUES('TX','Dallas',1213825);
10UPSERT INTO us_population VALUES('CA','San Jose',912332);
11
12

3.3 修改数据


1
2
3
4
1-- 插入主键相同的数据就视为更新
2UPSERT INTO us_population VALUES('NY','New York',999999);
3
4

3.4 删除数据


1
2
3
1DELETE FROM us_population WHERE city='Dallas';
2
3

3.5 查询数据


1
2
3
4
5
6
1SELECT state as "州",count(city) as "市",sum(population) as "热度"
2FROM us_population
3GROUP BY state
4ORDER BY sum(population) DESC;
5
6

3.6 退出命令


1
2
3
1!quit
2
3

3.7 扩展

从上面的操作中可以看出,Phoenix支持大多数标准的SQL语法。关于Phoenix支持的语法、数据类型、函数、序列等详细信息,因为涉及内容很多,可以参考其官方文档,官方文档上有详细的说明:

四、Phoenix Java API

因为Phoenix遵循JDBC规范,并提供了对应的数据库驱动PhoenixDriver,这使得采用Java语言对其进行操作的时候,就如同对其他关系型数据库一样,下面给出基本的使用示例。

4.1 引入Phoenix core JAR包

如果是maven项目,直接在maven中央仓库找到对应的版本,导入依赖即可:


1
2
3
4
5
6
7
8
1 <!-- https://mvnrepository.com/artifact/org.apache.phoenix/phoenix-core -->
2    <dependency>
3      <groupId>org.apache.phoenix</groupId>
4      <artifactId>phoenix-core</artifactId>
5      <version>4.14.0-cdh5.14.2</version>
6    </dependency>
7
8

如果是普通项目,则可以从Phoenix解压目录下找到对应的JAR包,然后手动引入:

4.2 简单的Java API实例


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1import java.sql.Connection;
2import java.sql.DriverManager;
3import java.sql.PreparedStatement;
4import java.sql.ResultSet;
5
6
7public class PhoenixJavaApi {
8
9    public static void main(String[] args) throws Exception {
10
11        // 加载数据库驱动
12        Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
13
14        /*
15         * 指定数据库地址,格式为 jdbc:phoenix:Zookeeper地址
16         * 如果HBase采用Standalone模式或者伪集群模式搭建,则HBase默认使用内置的Zookeeper,默认端口为2181
17         */
18        Connection connection = DriverManager.getConnection("jdbc:phoenix:192.168.200.226:2181");
19
20        PreparedStatement statement = connection.prepareStatement("SELECT * FROM us_population");
21
22        ResultSet resultSet = statement.executeQuery();
23
24        while (resultSet.next()) {
25            System.out.println(resultSet.getString("city") + " "
26                    + resultSet.getInt("population"));
27        }
28
29        statement.close();
30        connection.close();
31    }
32}
33
34

结果如下:

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

参考资料

  1. http://phoenix.apache.org/

更多大数据系列文章可以参见个人 GitHub 开源项目: 程序员大数据入门指南

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索