了解并安装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

《Spark原理深入与编程实战》