了解并安装Apache Phoenix
HBase Shell并不好用,并且HBase也不支持二次索引。为此,社区开发了一个专用于HBase的OLAP工具“Apache Phoenix”。
Apache Phoenix是什么?
Apache Phoenix 是一个Hadoop上的OLTP和业务数据分析引擎,为用户提供操作 HBase的SQL接口,结合了具有完整ACID事务功能的标准SQL和JDBC API,以及来自 NoSQL的后期绑定,具有读取模式灵活的优点。
Apache Phoenix将OLTP和操作分析结合起来,在Hadoop中实现低延迟应用:
- 标准SQL和JDBC API的强大功能,具有完整的ACID事务功能;
- 通过利用HBase作为支持存储,提供NoSQL的延迟绑定、模式读取功能的灵活性。
Phoenix提供以下功能:
- 将SQL查询编译为本机HBase扫描
- 确定扫描键的最佳开始和停止
- 编排扫描的并行执行
- 将计算带入数据
- 将where子句中的谓词推到服务器端过滤器
- 通过服务器端钩子(称为协处理器)执行聚合查询
因此,Phoenix的性能甚至比我们自己编写的还要好(更不用说代码要少得多)。
除了以上功能外,Phoenix还做了一些增强,以进一步优化性能:
- 用于改进非行键列查询性能的二级索引
- 统计数据收集以改进并行化,并指导优化之间的选择
- 跳过扫描过滤器来优化IN、LIKE和OR查询
- 可选的行键加盐以均匀地分配写负载
Apache Phoenix对SQl的支持
Apache Phoenix接收用户的SQL查询,将其编译成一系列HBase扫描,并编排这些扫描的运行,以生成常规的JDBC结果集。直接使用HBase API,以及协处理器和自定义过滤器,对于小的查询,可以获得毫秒级的性能;对于数千万行,可以获得秒级的性能。
Apache Phoenix支持所有标准的SQL查询结构,包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY等。它还支持一组完整的DML命令,以及通过DDL命令创建表和进行版本化的增量更改。
以下是目前不支持的功能列表:
- 关系运算符。交集、差集。
- 各种各样的内置函数。
Apache Phoenix完全集成了其他Hadoop产品,如Spark、Hive、Pig、Flume和Map Reduce。
谁在用Apache Phoenix?
许多企业都在使用Phoenix,下图是其的一部分:
安装和使用Apache Phoenix
请按照以下步骤安装Phoenix:
- 1) 下载并解压缩tar包(注意下载与HBase版本兼容的版本);
- 2) 将phoenix-4.15.0-HBase-1.4-server.jar拷贝到每个HBase的regionserver的lib目录下;
- 3) 将HBase的配置文件hbase-site.xml拷贝到Phoenix的bin目录下;
- 4) 启动HBase集群(或重启regionserver);
- 5) 将phoenix-client-4.15.0-HBase-1.4.jar添加到HBase客户端的classpath下。
要使用Phoenix,有多种方式。
- 使用命令行脚本lib/sqlline.py
- 使用GUI客户端工具,如SQuirrel或DBeaver
- 使用SQL脚本
Phoenix的bin目录下,自带了一个客户端脚本sqlline.py,可用来连接HBase,以命令行的方式操作HBase。
请按下面的步骤来掌握sqlline.py的使用。
1)首先,要启动HDFS集群和HBase集群。在Linux的终端窗口,执行如下命令:
$ start-dfs.sh $ start-hbase.sh
2)使用Phoenix shell客户端连接HBase。在终端窗口中,执行如下命令:
$ cd ~/bigdata/phoenix-4.15.0-HBase-1.4 $ ./bin/sqlline.py localhost:2181:/hbase
如下图所示:
3)在Phoenix Shell命令行下,对HBase进行操作。
-- 创建表 CREATE TABLE IF NOT EXISTS us_population ( state CHAR(2) NOT NULL, city VARCHAR NOT NULL, population BIGINT CONSTRAINT my_pk PRIMARY KEY (state, city) );
在phoenix中,默认情况下,表名等会自动转换为大写,若要小写,使用双引号,如"us_population"。
-- 显示所有表 !table 或 !tables -- 插入记录 upsert into us_population values('NY','NewYork',8143197); -- 查询记录 select * from us_population ; select * from us_population wherestate='NY'; -- 删除记录 delete from us_population wherestate='NY'; -- 删除表 drop table us_population; -- 退出命令行 !quit