1、简介
hbase是一个独立的数据库,因此内部的操作语句也是独立的,与SQL完全不同,通常使用Apache Phoenix将SQL语句和hbase互通,这样就能平稳过渡了。
Phoenix是一个开源的HBASE SQL层。Phoeinx可以用标准的JDBC API替代HBASE client API来创建表,插入和查询查询HBASE中的数据。
现有hbase的查询工具有很多如:Hive,Tez,Impala,Shark/Spark,Phoenix等。phoenix是一个在hbase上面实现的基于hadoop的OLTP技术,具有低延迟、事务性、可使用sql、提供jdbc接口的特点。 而且phoenix还提供了hbase二级索引的解决方案,丰富了hbase查询的多样性,继承了hbase海量数据快速随机查询的特点。但是在生产环境中,不可以用在OLTP中。在线事务处理的环境中,需要低延迟,而Phoenix在查询HBase时,虽然做了一些优化,但延迟还是不小。所以依然是用在OLAP中,再将结果返回存储下来。
Phoenix完全使用Java编写,作为HBase内嵌的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫描,并编排执行以生成标准的JDBC结果集。直接使用HBase API、协同处理器与自定义过滤器,对于简单查询来说,其性能量级是毫秒,对于百万级别的行数来说,其性能量级是秒。
1.1 优势
- Phoenix作为应用层和HBASE之间的中间件,以下特性使它在大数据量的简单查询场景有着独有的优势:
- 二级索引支持(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
2、使用
- Hbase内置了Phoenix的执行引擎,所以只需要把jar包拷贝至Hbase的lib中即可使用
- 下载bin包解压,由于hbase版本是2.2+,所以我们选择Phoenix5.0版本:链接
将phoenix-5.0.0-HBase-2.0-server.jar拷贝至每一台Hbase中
cp phoenix-5.0.0-HBase-2.0-server.jar /opt/hbase/lib/
# 分发
scp phoenix-5.0.0-HBase-2.0-server.jar root@hadoop101:/opt/hbase/lib
scp phoenix-5.0.0-HBase-2.0-server.jar root@hadoop103:/opt/hbase/lib
scp phoenix-5.0.0-HBase-2.0-server.jar root@hadoop104:/opt/hbase/lib
重启Hbase集群
bin/stop-hbase.sh
bin/start-hbase.sh
Phoenix的shell调用方式是通过bin目录下的./sqlline.py脚本完成的,常规开发中,Phoenix会完全兼容JDBC,只要底层与JDBC兼容的框架理论上都可以使用Phoenix来操作Hbase。
# 安装python环境
yum install python2
如果是CenterOS8会提示python找不到,这时候就修改脚本文件头部,然后执行。
#!/usr/bin/python2
修改运行环境配置,增加两个环境变量 ```shell vim /opt/phoenix/bin/config/env.sh
JAVA_HOME=/opt/jdk1.8 HBASE_PATH=/opt/hbase
- 启动脚本,注意,脚本后边跟的参数是Zookeeper集群的每一台主机名,端口号应和Zookeeper客户端口号一致。
```shell
./sqlline.py hadoop101,hadoop102,hadoop103,hadoop104:2181
- 出错,缺少环境变量,我们在profile文件中加入以下变量
export HADOOP_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS=‘-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_LIB_NATIVE_DIR’