BigData-Notes/notes/Hbase的SQL中间层_Phoenix.md
2019-05-31 15:15:28 +08:00

9.8 KiB
Raw Blame History

Hbase的SQL中间层——Phoenix

一、Phoenix简介
二、Phoenix安装
    2.1 下载并解压
    2.2 拷贝Jar包
    2.3 重启 Region Servers
    2.4 启动Phoenix
    2.5 启动结果
三、Phoenix 简单使用
    3.1 创建表
    3.2 插入数据
    3.3 修改数据
    3.4 删除数据
    3.5 查询数据
    3.6 退出命令
    3.7 扩展
四、Phoenix Java API
    4.1 引入Phoenix core JAR包
    4.2 简单的Java API实例

一、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。

其次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

# 下载
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目录下。

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

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查看当前所有表的信息

三、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 进行查看:

3.2 插入数据

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

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支持的语句、数据类型、函数、序列等详细信息因为涉及内容很多可以参考其官方文档官方文档上有详细的说明

四、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/