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之间的中间件,以下特性使它在大数据量的简单查询场景有着独有的优势:
  1. 二级索引支持(global index + local index)
  2. 编译SQL成为原生HBASE的可并行执行的scan
  3. 在数据层完成计算,server端的coprocessor执行聚合
  4. 下推where过滤条件到server端的scan filter上
  5. 利用统计信息优化、选择查询计划(5.x版本将支持CBO)
  6. skip scan功能提高扫描速度
  • 一般可以使用以下三种方式访问Phoenix
  1. JDBC API
  2. 使用Python编写的命令行工具(sqlline, sqlline-thin和psql等)
  3. SQuirrel

2、使用

  • Hbase内置了Phoenix的执行引擎,所以只需要把jar包拷贝至Hbase的lib中即可使用
  • 下载bin包解压,由于hbase版本是2.2+,所以我们选择Phoenix5.0版本:链接
  • phoenix-5.0.0-HBase-2.0-server.jar拷贝至每一台Hbase中

    1. cp phoenix-5.0.0-HBase-2.0-server.jar /opt/hbase/lib/
    2. # 分发
    3. scp phoenix-5.0.0-HBase-2.0-server.jar root@hadoop101:/opt/hbase/lib
    4. scp phoenix-5.0.0-HBase-2.0-server.jar root@hadoop103:/opt/hbase/lib
    5. scp phoenix-5.0.0-HBase-2.0-server.jar root@hadoop104:/opt/hbase/lib
  • 重启Hbase集群

    1. bin/stop-hbase.sh
    2. bin/start-hbase.sh
  • Phoenix的shell调用方式是通过bin目录下的./sqlline.py脚本完成的,常规开发中,Phoenix会完全兼容JDBC,只要底层与JDBC兼容的框架理论上都可以使用Phoenix来操作Hbase。

    1. # 安装python环境
    2. yum install python2
  • 如果是CenterOS8会提示python找不到,这时候就修改脚本文件头部,然后执行。

    1. #!/usr/bin/python2
  • 修改运行环境配置,增加两个环境变量 ```shell vim /opt/phoenix/bin/config/env.sh

JAVA_HOME=/opt/jdk1.8 HBASE_PATH=/opt/hbase

  1. - 启动脚本,注意,脚本后边跟的参数是Zookeeper集群的每一台主机名,端口号应和Zookeeper客户端口号一致。
  2. ```shell
  3. ./sqlline.py hadoop101,hadoop102,hadoop103,hadoop104:2181
  • 出错,缺少环境变量,我们在profile文件中加入以下变量
    1. export HADOOP_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
    2. export HADOOP_OPTS=‘-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_LIB_NATIVE_DIR