前言
使用HBase已有一段时间,期间发现HBase不支持SQL查询和二级索引,导致业务在使用时无法更好的利用现有的经验来查询HBase。虽然HBase本身不支持SQL,但业界还是有现成的方案来支持,如Hive、Impala、Phoenix等。众多方案各有各的优势,本文主要对Phoenix作一个大概的介绍。
什么是Phoenix
Phoenix中文翻译为凤凰
, 其最早是Salesforce的一个开源项目,Salesforce背景是一个搞ERP的,ERP软件一个很大的特点就是数据库操作,所以能搞出一个数据库中间件也是很正常的。而后,Phoenix成为Apache基金的顶级项目。
Phoenix具体是什么呢,其本质是用Java写的基于JDBC API操作HBase的开源SQL引擎。
优势
- 二级索引支持(global index + local index)
- 编译SQL成为原生HBASE的可并行执行的scan
- 在数据层完成计算,server端的coprocessor执行聚合
- 下推where过滤条件到server端的scan filter上
- 利用统计信息优化、选择查询计划(5.x版本将支持CBO)
- skip scan功能提高扫描速度
访问方式
一般可以使用以下三种方式访问Phoenix:
- JDBC API
- 使用Python编写的命令行工具(sqlline, sqlline-thin和psql等)
- SQuirrel
安装Phoenix
环境准备
- CDH:5.15.1
- Ubuntu:xenial
查看Ubuntu版本:
sudo lsb_release -a
下载parcel
Phoenix有HBase版本,也有CDH版本,这里用的是CDH,所以下载CDH版本的Phoenix,下载地址:http://www.apache.org/dist/phoenix/apache-phoenix-4.14.0-cdh5.14.2/parcels/
,由于Apache的资源下载慢,可以访问国内的镜像地址:https://mirrors.tuna.tsinghua.edu.cn/apache/phoenix/apache-phoenix-4.14.0-cdh5.14.2/parcels/
1、进入parcel-repo
目录
cd /opt/cloudera/parcel-repo/
2、下载parcel和manifest文件
wget https://mirrors.tuna.tsinghua.edu.cn/apache/phoenix/apache-phoenix-4.14.0-cdh5.14.2/parcels/APACHE_PHOENIX-4.14.0-cdh5.14.2.p0.3-xenial.parcel
wget https://mirrors.tuna.tsinghua.edu.cn/apache/phoenix/apache-phoenix-4.14.0-cdh5.14.2/parcels/manifest.json
3、新建sha文件
由于没有sha文件,会提示未找到哈希文件,从Apache官网上下载的sha文件不能用,经过百度,可以自己生成sha文件。
cat manifest.json # 查看xenial版本对应的哈希值,这里是5aebefdeb239a9dc7a042b891e2aac98336a25bc
vi APACHE_PHOENIX-4.14.0-cdh5.14.2.p0.3-xenial.parcel.sha
5aebefdeb239a9dc7a042b891e2aac98336a25bc
4、登录Cloudera Manager,点击检查新parcel。
5、点击分配和激活按钮,激活成功后如下。
6、配置HBase
7、拷贝Phoenix的jar到HBase下
cp phoenix-4.14.0-cdh5.14.2-*.jar /opt/cloudera/parcels/CDH-5.15.1-1.cdh5.15.1.p0.4/lib/hbase/
8、拷贝hbase-site.xml到Phoenix下
cp hbase-site.xml /opt/cloudera/parcels/APACHE_PHOENIX/bin/
hbase-site.xml在/etc/hbase/conf下。
9、重启HBase
连接HBase
1、连接到HBase
cd /opt/cloudera/parcels/APACHE_PHOENIX/bin/
2、使用Phoenix登录HBase,需要指定Zookeeper
phoenix-sqlline.py 398.cdh.master:2181
基本操作
- !table: 列出表
- !quit: 退出
HBase已有的表不会显示出来,得通过创建视图来映射HBase中的表。
create view "student"(
pk varchar primary key,
"name"."history" varchar,
"number"."age" varchar
);
查看视图是否和HBase一致。
select * from "student";