个人主页:http://www.linbingdong.com
简书地址:http://www.jianshu.com/users/6cb45a00b49c/latest_articles
网上关于Phoenix的资料寥寥无几,中文资料更是几乎没有。本人详细阅读Phoenix官网,整理成此篇中文文档,供后人参考。如有翻译错误的地方,请批评指出。
1. Phoenix定义
Phoenix最早是saleforce的一个开源项目,后来成为Apache基金的顶级项目。
Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs而不是HBase客户端APIs来创建表,插入数据和对HBase数据进行查询。
put the SQL back in NoSQL
Phoenix完全使用Java编写,作为HBase内嵌的JDBC驱动。Phoenix查询引擎会将SQL查询转换为一个或多个HBase扫描,并编排执行以生成标准的JDBC结果集。直接使用HBase API、协同处理器与自定义过滤器,对于简单查询来说,其性能量级是毫秒,对于百万级别的行数来说,其性能量级是秒。
HBase的查询工具有很多,如:Hive、Tez、Impala、Spark SQL、Phoenix等。
Phoenix通过以下方式使我们可以少写代码,并且性能比我们自己写代码更好:
- 将SQL编译成原生的HBase scans。
- 确定scan关键字的最佳开始和结束
- 让scan并行执行
- ...
使用Phoenix的公司
2. 历史演进
- 3.0/4.0 release
ARRAY Type. 支持标准的JDBC数组类型
Sequences. 支持 CREATE/DROP SEQUENCE, NEXT VALUE FOR, CURRENT VALUE FOR也实现了
Multi-tenancy. 同一张HBase物理表上,不同的租户可以创建相互独立的视图
Views. 同一张HBase物理表上可以创建不同的视图
- 3.1/4.1 release
Apache Pig Loader . 通过pig来处理数据时支持pig加载器来利用Phoenix的性能
Derived Tables. 允许在一个FROM子句中使用SELECT子句来定义一张衍生表
Local Indexing. 后面介绍
Tracing. 后面介绍
- 3.2/4.2 release
Subqueries 支持在WHERE和FROM子句中的独立子查询和相关子查询
Semi/anti joins. 通过标准的[NOT] IN 和 [NOT] EXISTS关键字来支持半/反连接
Optimize foreign key joins. 通过利用跳跃扫描过滤器来优化外键连接
Statistics Collection. 通过收集表的统计信息来提高并行查询能力
- 3.3/4.3 release
Many-to-many joins. 支持两边都太大以至于无法放进内存的连接
Map-reduce Integration. 支持Map-reduce集成
Functional Indexes. 后面介绍
- 4.4 release
User Defined Functions. 后面介绍
- 4.5 release
Asynchronous Index Population. 通过一个Map-reduce job,索引可以被异步创建
- 4.6 release
Time series Optimization. 优化针对时间序列数据的查询
- 4.7 release
Transaction Support. 后面介绍
- 4.8 release
DISTINCT Query Optimization. 使用搜索逻辑来大幅提高 SELECT DISTINCT 和 COUNT DISTINCT的查询性能
Local Index Improvements. Reworked 后面介绍
Hive Integration. 能够在Phoenix内使用Hive来支持大表和大表之间的连接
Namespace Mapping. 将Phoenix schema映射到HBase的命名空间来增强不同schema之间的隔离性
3. 特性
3.1 Transactions (beta) 事务
该特性还处于beta版,并非正式版。通过集成Tephra,Phoenix可以支持ACID特性。Tephra也是Apache的一个项目,是事务管理器,它在像HBase这样的分布式数据存储上提供全局一致事务。HBase本身在行层次和区层次上支持强一致性,Tephra额外提供交叉区、交叉表的一致性来支持可扩展性。
要想让Phoenix支持事务特性,需要以下步骤:
- 配置客户端hbase-site.xml
<property>
<name>phoenix.transactions.enabled</name>
<value>true</value>
</property>
- 配置服务端hbase-site.xml
<property>
<name>data.tx.snapsh