前文说到Hbase没有类似ORM这类的东西,操作查询全靠java逻辑,很不方便。所以横空出世了Phoenix。
Phoenix与HBase中的表是独立的,两者之间没有必然的关系。
如果要通过Phoenix操作Hbase中的表,则需要在Phoenix的系统表中加入Hbase的相关信息。实际上Phoenix也是通过这种形式来查询Hbase中的表的,这样子看来Phoenix有点像数据表中的Hmaster,cuiyaonan2000@163.com
Phoenix创建表时会自动调用HBase客户端创建相应的表(使用hbase client api),创建八张系统表(这些表也是创建在HBase中的表,只是所属对象是Phoenix):
- SYSTEM.CATALOG(其中SYSTEM.CATALOG表用于存放Phoenix创建表时的元数据,即用于存储记录Hbase中的表,如此才能操作关联Hbase)
- SYSTEM.FUNCTION
- SYSTEM.LOG
- SYSTEM.SEQUENCE
- SYSTEM.STATS
- SYSTEM.CHILD_LINK
- SYSTEM.TASK
并且在SYSTEM.CATALOG系统表中记录Phoenix创建表时的元数据:
- 其主键的值对应HBase的RowKey
- 非主键的列对应HBase的Column
- 列族不指定时为0,且列会进行编码
- 如果是通过Phoenix创建的表,那么必须通过Phoenix客户端来对表进行操作,因为通过Phoenix创建的表其非主键的列会进行编码---------------这样我们的代码中就需要维护2个客户端,A:phoenix客户端 B:Hbase客户端
- 官网网址:http://phoenix.apache.org/
- 阿里的官方网址:https://help.aliyun.com/document_detail/69105.html?spm=a2c4g.11186623.6.714.4ab149f3b09Zou
Phoenix是一个开源的HBASE SQL层(即Phoenix是应用层和Hbase的中间件cuiyaonan2000@163.com)。
它不仅可以使用标准的JDBC API替代HBASE client API创建表,插入和查询HBASE,也支持二级索引、事务以及多种SQL层优化。
Phoenix使用JAVA语言进行编写,其查询引擎会将SQL查询语句转换成一个或多个HBase Scanner,且并行执行生成标准的JDBC结果集。
- Phoenix完全使用Java编写,作为HBase内嵌的JDBC驱动。
- Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫描,并编排执行以生成标准的JDBC结果集。
- 直接使用HBase API、协同处理器与自定义过滤器,对于简单查询来说,其性能量级是毫秒,对于百万级别的行数来说,其性能量级是秒。
HBase的查询工具有很多,如:Hive、Tez、Impala、Spark SQL、Phoenix等。
Phoenix通过以下方式使我们可以少写代码,并且性能比我们自己写代码更好:
- 将SQL编译成原生的HBase scans。
- 确定scan关键字的最佳开始和结束
- 让scan并行执行
- ...
由于Phoenix是内嵌在HBase的JDBC驱动,且HBase是通过JAVA语言编写的,其基于HDFS,且依赖于Zookeeper进行服务的协调和HA高可用配置,因此~~~~~~~~~~~~~~~~~~~~~.
根据hbase选择指定的版本
#下载
[root@cuiyaonan2000 phoenix] wget https://mirrors.tuna.tsinghua.edu.cn/apache/phoenix/phoenix-5.1.1/phoenix-hbase-2.3-5.1.1-bin.tar.gz
#解压
#将解压后的phoenix-server-hbase-2.3-5.1.1.jar 放置到各个节点的hbase的lib文件夹下
[root@cuiyaonan2000 phoenix] tar -zxvf phoenix-hbase-2.3-5.1.1-bin.tar.gz
- 将解压后的phoenix-server-hbase-2.3-5.1.1.jar 放置到各个节点的hbase的lib文件夹下
- 重启hbase(当HBase集群启动时将会加载Phoenix,并加载hbase-site.xml配置文件(存放HBase和Phoenix的配置),此时可以使用Phoenix客户端进行连接,通过标准的JDBC来操作HBase)
- Phoenix第一次启动时,会在HBase中创建八张系统表,用于存放Phoenix的相关信息。
部署完成后再phoenix的bin目录下执行命令:
#登录phoenix
[root@cuiyaonan2000 phoenix] ./sqlline.py zookeeper的ip不包含端口
# 执行脚本命令示例
[root@cuiyaonan2000 phoenix] sqlline.py localhost ../examples/stock_symbol.sql
#退出phoenix客户端命令
!quit
显示如下内容:
输入!tables 可以看到phoenix已经在hbase中创建了8张表,用于管理自身的数据和管理hbase的表--其中catalog是重点表
同时查看hbase的管理界面,可以看到如上的表其实是建立在了hbase上