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
# 下载
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支持的语法、数据类型、函数、序列等详细信息,因为涉及内容很多,可以参考其官方文档,官方文档上有详细的说明:
- 语法(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中央仓库找到对应的版本,导入依赖即可:
 <!-- 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();
    }
}
结果如下:
 
 实际的开发中我们通常都是采用第三方框架来操作数据库,如mybatis,Hibernate,Spring Data等。关于Phoenix与这些框架的整合步骤参见下一篇文章:Spring/Spring Boot + Mybatis + Phoenix
参考资料
更多大数据系列文章可以参见个人 GitHub 开源项目: 程序员大数据入门指南
HBase 学习之路(十)—— HBase的SQL中间层 Phoenix的更多相关文章
- HBase学习之路 (一)HBase基础介绍
		产生背景 自 1970 年以来,关系数据库用于数据存储和维护有关问题的解决方案.大数据的出现后, 好多公司实现处理大数据并从中受益,并开始选择像 Hadoop 的解决方案.Hadoop 使用分 布式文 ... 
- HBase 学习之路(一)——  HBase简介
		一.Hadoop的局限 HBase是一个构建在Hadoop文件系统之上的面向列的数据库管理系统. 要想明白为什么产生HBase,就需要先了解一下Hadoop存在的限制?Hadoop可以通过HDFS来存 ... 
- HBase 学习之路(八)——HBase协处理器
		一.简述 在使用HBase时,如果你的数据量达到了数十亿行或数百万列,此时能否在查询中返回大量数据将受制于网络的带宽,即便网络状况允许,但是客户端的计算处理也未必能够满足要求.在这种情况下,协处理器( ... 
- HBase 系列(十)—— HBase 的 SQL 中间层 Phoenix
		一.Phoenix简介 Phoenix 是 HBase 的开源 SQL 中间层,它允许你使用标准 JDBC 的方式来操作 HBase 上的数据.在 Phoenix 之前,如果你要访问 HBase,只能 ... 
- 大数据学习之路之HBASE
		Hadoop之HBASE 一.HBASE简介 HBase是一个开源的.分布式的,多版本的,面向列的,半结构化的NoSql数据库,提供高性能的随机读写结构化数据的能力.它可以直接使用本地文件系统,也可以 ... 
- HBase学习之路 (二)HBase集群安装
		前提 1.HBase 依赖于 HDFS 做底层的数据存储 2.HBase 依赖于 MapReduce 做数据计算 3.HBase 依赖于 ZooKeeper 做服务协调 4.HBase源码是java编 ... 
- HBase学习之路 (十一)HBase的协过滤器
		协处理器—Coprocessor 1. 起源 Hbase 作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执 行求和.计数.排序等操作.比如,在旧版本的(<0.92)Hba ... 
- HBase学习之路 (三)HBase集群Shell操作
		进入HBase命令行 在你安装的随意台服务器节点上,执行命令:hbase shell,会进入到你的 hbase shell 客 户端 [hadoop@hadoop1 ~]$ hbase shell S ... 
- HBase 学习之路(九)——HBase容灾与备份
		一.前言 本文主要介绍Hbase常用的三种简单的容灾备份方案,即CopyTable.Export/Import.Snapshot.分别介绍如下: 二.CopyTable 2.1 简介 CopyTabl ... 
随机推荐
- MyEclipse迅速
			MyEclipse迅速 1.详细例如以下图 2.提示原因 3.解决方案 版权声明:本文博主原创文章.博客,未经同意不得转载. 
- Linux下编译,要下载tar.xz,而不要下载zip,因为换行的编码不一样,对.h.cpp没有影响,但是对脚本有影响 good
			原因是 在win下编辑的时候,换行结尾是\n\r , 而在linux下 是\n,所以才会有 多出来的\r但是这个我是直接下载的官网文件解压的,没有动过啊. 破案了. linux下编译要下 .tar.x ... 
- Win32 Windows计划 十一年
			一个.使用位图 1 位图 - 由图像上的各点的颜色被保存,生成对应的位图文件 栅格 - 保存图像可以理解为晶格 矢量图 - 能够理解为画图命令的保存 2 位图的使用 2.1 载入位图 LoadBitm ... 
- HDU4421 Bit Magic 【2-sat】
			叙述性说明: 这给出了一个矩阵,原来的请求a排列 2-sat称号.对于每一位跑步边,跑31位可 详细的施工方 注意N=1的情况特判,还有检查对称元素是否同样 #include <stdio.h& ... 
- VISTA 与输入法程式介面
			原文:VISTA 与输入法程式介面 VISTA 与输入法程式介面 文/黄忠成 近日,我所兼职顾问的公司开始将旧有的Win32 程式及新开发的.NET 应用程式移转到VISTA 系 ... 
- 什么是YAML?
			YAML是"YAML不是一种标记语言"的外语缩写 [1] (见前方参考资料原文内容):但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名.它是一种直观的能 ... 
- 零元学Expression Blend 4 - Chapter 38 看如何使用Clip修出想要的完美曲线(下)
			原文:零元学Expression Blend 4 - Chapter 38 看如何使用Clip修出想要的完美曲线(下) 你可以把Clip想成是一个遮罩,运用遮罩达到我们想要的效果 所以在这里我们把文字 ... 
- PopupWindow设置动画效果
			创建popupwindow的方法 Button menu; private void showPopupWindow() { //设置contentView float density = Densi ... 
- Android零基础入门第64节:揭开RecyclerView庐山真面目
			原文:Android零基础入门第64节:揭开RecyclerView庐山真面目 大家还记得之前在第38期~第50期都在学习列表控件吗,其中用了8期讲ListView的使用,相信都已经掌握好了吧.那么本 ... 
- 安装 VirtualBox 出现回滚,无法安装及解决方法
			原文:安装 VirtualBox 出现回滚,无法安装及解决方法 缘由:打算安装 Vagrant,因此打算安装 VirtualBox. 现象:安装 VirtualBox,进度快到最后的时候,安装程序执行 ... 
