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(联机分析处理)中,再将结果返回存储下来。
部署
这里安装HBase 版本是 1.2 安装的Phoenix 的版本是 4.8.0
- 下载安装文件
上传安装包并解压
# 解压
[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 的使用