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

1、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 JPAMybatis 等经常使用的持久层框架来操做 HBase。html

其次 Phoenix 的性能表现也很是优异,Phoenix 查询引擎会将 SQL 查询转换为一个或多个 HBase Scan,经过并行执行来生成标准的 JDBC 结果集。它经过直接使用 HBase API 以及协处理器和自定义过滤器,能够为小型数据查询提供毫秒级的性能,为千万行数据的查询提供秒级的性能。同时 Phoenix 还拥有二级索引等 HBase 不具有的特性,由于以上的优势,因此 Phoenix 成为了 HBase 最优秀的 SQL 中间层。java

2、Phoenix安装

咱们能够按照官方安装说明进行安装,官方说明以下:git

  • 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.htmlgithub

# 下载
wget 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
# 解压
tar tar apache-phoenix-4.14.0-cdh5.14.2-bin.tar.gz

2.2 拷贝Jar包

按照官方文档的说明,须要将 phoenix server jar 添加到全部 Region Servers 的安装目录的 lib 目录下。sql

这里因为我搭建的是 HBase 伪集群,因此只须要拷贝到当前机器的 HBase 的 lib 目录下。若是是真实集群,则使用 scp 命令分发到全部 Region Servers 机器上。shell

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

# 中止Hbase
stop-hbase.sh
# 启动Hbase
start-hbase.sh

2.4 启动Phoenix

在 Phoenix 解压目录下的 bin 目录下执行以下命令,须要指定 Zookeeper 的地址:数据库

  • 若是 HBase 采用 Standalone 模式或者伪集群模式搭建,则默认采用内置的 Zookeeper 服务,端口为 2181;
  • 若是是 HBase 是集群模式并采用外置的 Zookeeper 集群,则按照本身的实际状况进行指定。
# ./sqlline.py hadoop001:2181

2.5 启动结果

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

3、Phoenix 简单使用

3.1 建立表

CREATE TABLE IF NOT EXISTS us_population (
      state CHAR(2) NOT NULL,
      city VARCHAR NOT NULL,
      population BIGINT
      CONSTRAINT my_pk PRIMARY KEY (state, city));

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

3.2 插入数据

Phoenix 中插入数据采用的是 UPSERT 而不是 INSERT,由于 Phoenix 并无更新操做,插入相同主键的数据就视为更新,因此 UPSERT 就至关于 UPDATE+INSERTapp

UPSERT INTO us_population VALUES('NY','New York',8143197);
UPSERT INTO us_population VALUES('CA','Los Angeles',3844829);
UPSERT INTO us_population VALUES('IL','Chicago',2842518);
UPSERT INTO us_population VALUES('TX','Houston',2016582);
UPSERT INTO us_population VALUES('PA','Philadelphia',1463281);
UPSERT INTO us_population VALUES('AZ','Phoenix',1461575);
UPSERT INTO us_population VALUES('TX','San Antonio',1256509);
UPSERT INTO us_population VALUES('CA','San Diego',1255540);
UPSERT INTO us_population VALUES('TX','Dallas',1213825);
UPSERT INTO us_population VALUES('CA','San Jose',912332);

3.3 修改数据

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

3.4 删除数据

DELETE FROM us_population WHERE city='Dallas';

3.5 查询数据

SELECT state as "州",count(city) as "市",sum(population) as "热度"
FROM us_population
GROUP BY state
ORDER BY sum(population) DESC;

3.6 退出命令

!quit

3.7 扩展

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

4、Phoenix Java API

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

4.1 引入Phoenix core JAR包

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

<!-- https://mvnrepository.com/artifact/org.apache.phoenix/phoenix-core -->
    <dependency>
      <groupId>org.apache.phoenix</groupId>
      <artifactId>phoenix-core</artifactId>
      <version>4.14.0-cdh5.14.2</version>
    </dependency>

若是是普通项目,则能够从 Phoenix 解压目录下找到对应的 JAR 包,而后手动引入:

4.2 简单的Java API实例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;


public class PhoenixJavaApi {

    public static void main(String[] args) throws Exception {

        // 加载数据库驱动
        Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");

        /*
         * 指定数据库地址,格式为 jdbc:phoenix:Zookeeper 地址
         * 若是 HBase 采用 Standalone 模式或者伪集群模式搭建,则 HBase 默认使用内置的 Zookeeper,默认端口为 2181
         */
        Connection connection = DriverManager.getConnection("jdbc:phoenix:192.168.200.226:2181");

        PreparedStatement statement = connection.prepareStatement("SELECT * FROM us_population");

        ResultSet resultSet = statement.executeQuery();

        while (resultSet.next()) {
            System.out.println(resultSet.getString("city") + " "
                    + resultSet.getInt("population"));
        }

        statement.close();
        connection.close();
    }
}

结果以下:

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

参考资料

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

更多大数据系列文章能够参见 GitHub 开源项目大数据入门指南

相关文章
相关标签/搜索