Phoenix 部署与连接HBase


Phoenix 介绍

Phoenix 官网:https://phoenix.apache.org/

Phoenix 源码: https://github.com/apache/phoenix

HBase是一个 NoSQL 数据库,可存储大量非关系型数据。

HBase,可以用 HBase shell 进行操作,也可以用 HBase Java api 进行操作。HBase 虽然是一个数据库,但是它的查询语句,很不太好用。要是能像使用 Mysql 等关系型数据库一样用 sql 语句操作 HBase,那就很方便了。

Apache Phoenix 是构建在 HBase 之上的关系型数据库层,作为内嵌的客户端 JDBC 驱动用以对 HBase 中的数据进行低延迟访问。Apache Phoenix 会将用户编写的 sql 查询编译为一系列的 scan 操作,最终产生通用的 JDBC 结果集返回给客户端。数据表的元数据存储在HBase的表中被会标记版本号,所以进行查询的时候会自动选择正确的 schema。直接使用 HBase 的 API,结合协处理器(coprocessor)和自定义的过滤器的话,小范围的查询在毫秒级响应,千万数据的话响应速度为秒级。

Phoenix 是构建在 ApacheHBase 之上的一个 SQL 中间层。完全使用 Java 编写,代码位于 GitHub 上,并且提供了一个客户端可嵌入的 JDBC 驱动。

Phoenix 对于简单的低延迟查询,其量级为毫秒;对于百万级别的行数来说,其量级为秒。Phoenix 并不是像 HBase 那样用于 map-reduce job 的,而是通过标准化的语言来访问 HBase 数据的。对于 10M 到 100M 的行的简单查询来说,Phoenix 要胜过 Hive。对于使用了 HBaseAPI、协同处理器及自定义过滤器的 Impala 与 OpenTSDB 来说,进行相似的查询 Phoenix 的速度也会更快一些。

Phoenix 查询引擎会将 SQL 查询转换为一个或多个 HBase scan,并编排执行以生成标准的 JDBC 结果集。

直接使用 HBase API、协同处理器与自定义过滤器,对于简单查询来说,其性能量级是毫秒,对于百万级别的行数来说,其性能量级是秒。

Phoenix 最值得关注的一些特性有:

​ 嵌入式的 JDBC 驱动,实现了大部分的 java.sql 接口,包括元数据 API

​ 可以通过多部行键或是键/值单元对列进行建模

​ 完善的查询支持,可以使用多个谓词以及优化的扫描键

​ DDL 支持:通过 CREATE TABLE、DROP TABLE 及 ALTER TABLE 来添加/删除列

​ 版本化的模式仓库:当写入数据时,快照查询会使用恰当的模式

​ DML 支持:

  • 用于逐行插入的 UPSERT SELECT、
  • 用于删除行的 DELETEVALUES、
  • 用于相同或不同表之间大量数据传输的 UPSERT

​ 通过客户端的批处理实现的有限的事务支持单表——还没有连接,同时二级索引也在开发当中紧跟 ANSI SQL 标准

Phoenix,由 saleforce.com 开源的一个项目,后又捐给了 Apache。它相当于一个 Java 中间件,帮助开发者,像使用 jdbc 访问关系型数据库一些,访问 NoSql 数据库 HBase。

  • Phoenix 操作的表及数据,存储在hbase上。phoenix 只是需要和 Hbase 进行表关联起来。然后再用工具进行一些读或写操作。

其实,可以把 Phoenix 只看成一种代替 HBase 的语法的一个工具。虽然可以用 java 可以用 jdbc 来连接 phoenix,然后操作 HBase,但是在生产环境中,不可以用在 OLTP(在线事务处理) 中。在线事务处理的环境中,需要低延迟,而 Phoenix 在查询 HBase 时,虽然做了一些优化,但延迟还是不小。所以依然是用在OLAP(联机分析处理)中,再将结果返回存储下来。

Phoenix在Hadoop生态系统中的位置

部署

这里安装HBase 版本是 1.2 安装的Phoenix 的版本是 4.8.0

  • 下载安装文件

下载地址: http://archive.apache.org/dist/phoenix/apache-phoenix-4.8.0-HBase-1.2/bin/apache-phoenix-4.8.0-HBase-1.2-bin.tar.gz

上传安装包并解压

# 解压
[root@node1 hnbian]# tar -zxvf apache-phoenix-4.8.0-HBase-1.2-bin.tar.gz
[root@node1 hnbian]# ll
drwxr-xr-x 4 root root      4096 8月   7 2016 apache-phoenix-4.8.0-HBase-1.2-bin
-rw-r--r-- 1 root root 203242576 3月  10 17:25 apache-phoenix-4.8.0-HBase-1.2-bin.tar.gz

# 文件夹重命名
[root@node1 hnbian]# mv apache-phoenix-4.8.0-HBase-1.2-bin phoenix-4.8.0
[root@node1 hnbian]# 
[root@node1 hnbian]# ll
总用量 198484
-rw-r--r-- 1 root root 203242576 3月  10 17:25 apache-phoenix-4.8.0-HBase-1.2-bin.tar.gz
drwxr-xr-x 4 root root      4096 8月   7 2016 phoenix-4.8.0

上传 jar 文件

phoenix-4.8.0 目录下的 phoenix-4.8.0-HBase-1.2-server.jar 添加到 HBase 集群的所有 RegionServer 节点的 lib 目录下,然后重启HBase集群。

cp phoenix-4.8.0-HBase-1.2-server.jar /opt/appl/hnbian/lib

scp phoenix-4.8.0-HBase-1.2-server.jar root@slave1:/opt/hnbian/hbase/lib/

scp phoenix-4.8.0-HBase-1.2-server.jar root@slave2:/opt/hnbian/hbase/lib/

scp phoenix-4.8.0-HBase-1.2-server.jar root@slave3:/opt/hnbian/hbase/lib/

连接HBASE

# 查看当前路径
[root@node1 bin]# pwd 
/opt/hnbian/phoenix-4.8.0/bin

# 进入到 bin 目录下
[root@node1 phoenix-4.8.0]# cd bin/

# 查看 bin 目录下的文件
[root@node1 bin]# ll
总用量 140
drwxr-xr-x 4 root root   101 8月   7 2016 config
-rw-r--r-- 1 root root 32440 8月   7 2016 daemon.py
-rwxr-xr-x 1 root root  1881 8月   7 2016 end2endTest.py
-rw-r--r-- 1 root root  1621 8月   7 2016 hadoop-metrics2-hbase.properties
-rw-r--r-- 1 root root  3056 8月   7 2016 hadoop-metrics2-phoenix.properties
-rw-r--r-- 1 root root  1084 8月   7 2016 hbase-site.xml
-rw-r--r-- 1 root root  2583 8月   7 2016 log4j.properties
-rwxr-xr-x 1 root root  5128 8月   7 2016 performance.py
-rwxr-xr-x 1 root root  3249 8月   7 2016 pherf-cluster.py
-rwxr-xr-x 1 root root  2729 8月   7 2016 pherf-standalone.py
-rwxr-xr-x 1 root root  2116 8月   7 2016 phoenix_sandbox.py
-rwxr-xr-x 1 root root  9354 8月   7 2016 phoenix_utils.py
-rwxr-xr-x 1 root root  2739 8月   7 2016 psql.py
-rwxr-xr-x 1 root root  7659 8月   7 2016 queryserver.py
-rw-r--r-- 1 root root  1820 8月   7 2016 readme.txt
-rw-r--r-- 1 root root  1687 8月   7 2016 sandbox-log4j.properties
-rwxr-xr-x 1 root root  4315 8月   7 2016 sqlline.py
-rwxr-xr-x 1 root root  5426 8月   7 2016 sqlline-thin.py
-rwxr-xr-x 1 root root  6895 8月   7 2016 tephra
-rw-r--r-- 1 root root  2037 8月   7 2016 tephra-env.sh
-rwxr-xr-x 1 root root  6884 8月   7 2016 traceserver.py
  • 进入命令行
#slave1,slave2,slave3:2181 参数是 HBase 集群使用的 zookeeper 集群的ip地址,2181是zookeeper端口号
[root@node1 bin]# ./sqlline.py slave1,slave2,slave3:2181
Setting property: [incremental, false]
Setting property: [isolation, TRANSACTION_READ_COMMITTED]
issuing: !connect jdbc:phoenix:node1,node2,node3:2181 none none org.apache.phoenix.jdbc.PhoenixDriver
Connecting to jdbc:phoenix:node1,node2,node3:2181
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hnbian/phoenix-4.8.0/phoenix-4.8.0-HBase-1.2-client.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hdp/3.1.0.0-78/hadoop/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
23/03/10 17:37:12 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
...
sqlline version 1.1.9
0: jdbc:phoenix:slave1,slave2,slave3:2181> 

查看所有命令

Phoenix 使用 SQLLine 工具与 Phoenix 进行交互。每个命令都以感叹号(!)开头,并且可以在SQLLine命令行中使用。这些命令包括打开和关闭数据库连接、执行SQL语句、列出表和列、描述表、列出主键和索引、设置事务隔离级别、设置输出格式等等。该列表提供了每个命令的简要说明。例如,!set命令用于设置SQLLine变量。

SQLLine是一个基于Java的命令行界面工具,用于连接和管理关系数据库。它支持多种数据库系统,如Apache Derby、MySQL、PostgreSQL、Oracle等,并提供了许多功能,如SQL执行、自动完成、历史记录、脚本执行、事务管理等。它还提供了可定制的输出格式,并支持JDBC URL参数和属性文件的配置

0: jdbc:phoenix:slave1,slave2,slave3:2181> help
!all        对所有当前连接执行指定的SQL语句。
!autocommit        打开或关闭自动提交模式。
!batch        开始或执行一批SQL语句。
!brief        关闭详细模式。
!call        执行可调用语句。
!close        关闭当前数据库连接。
!closeall        关闭所有当前打开的数据库连接。
!columns        列出指定表的所有列。
!commit        提交当前事务(如果自动提交关闭)。
!connect        打开到数据库的新连接。
!dbinfo        获取有关数据库的元数据信息。
!describe        描述指定表的信息。
!dropall        删除当前数据库中的所有表。
!exportedkeys        列出指定表的所有导出键。
!go        选择当前连接。
!help        打印命令使用摘要。
!history        显示命令历史记录。
!importedkeys        列出指定表的所有导入键。
!indexes        列出指定表的所有索引。
!isolation        设置该连接的事务隔离级别
!list        列出当前的连接
!manual        显示 SQLLine 手册
!metadata        获取元数据信息
!nativesql        显示指定语句的本机 SQL
!outputformat        设置用于显示结果的输出格式(表格、垂直、csv、tsv、xmlattrs、xmlelements)
!primarykeys        列出指定表的所有主键
!procedures        列出所有过程
!properties        连接到在属性文件中指定的数据库
!quit        退出程序
!reconnect        重新连接到数据库
!record        将所有输出记录到指定文件中
!rehash        获取命令完成的表格和列名
!rollback        回滚当前事务(如果自动提交关闭)
!run        运行来自指定文件的脚本
!save        保存当前变量和别名
!scan        扫描已安装的 JDBC 驱动程序
!script        开始将脚本保存到文件中
!set        设置一个 sqlline 变量

查看表

0: jdbc:phoenix:slave1,slave2,slave3:2181> !tables

CATALOG、SEQUENCE、STATS 这三张表是系统自带的表。HBas e中已存在的表不会自动映射过来,需要手动创建相同结果的数据表,具体过程后面会说到

至此,Phoenix就安装完成了, 会在后面继续介绍 Phoenix 的使用


文章作者: hnbian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hnbian !
评论
 上一篇
Phoenix02 的数据类型介绍 Phoenix02 的数据类型介绍
1. 数值类型 数值类型 INTEGER 范围为 -2147483648 到 2147483647 与 java.lang.Integer 映射。但注意的是其二进制表示需要其会把第一个符号位进行翻转,这样保证负数排列在正数前面
2017-03-05
下一篇 
Phoenix 常用函数 Phoenix 常用函数
Phoenix 官方函数说明地址:https://phoenix.apache.org/language/functions.html 1. 数字函数1.1 ROUND将数字或时间戳表达式四舍五入到指定的最接近的比例或时间单位。 如果表达式
2017-03-02
  目录