Phoenix:在Apache HBase上执行SQL查询

近日,Salesforce.com开源了Phoenix,这是一个Java中间层,可以让开发者在Apache HBase上执行SQL查询。InfoQ有幸采访到了Salesforce.com的主开发者James Taylor以了解关于Phoenix的更多信息。

除了无数的SQL、NoSQL与NewSQL数据库,Salesforce.com又宣布Phoenix项目,这是构建在Apache HBase(列式大数据存储)之上的一个SQL中间层。Phoenix完全使用Java编写,代码位于GitHub上,并且提供了一个客户端可嵌入的JDBC驱动。

根据项目所述,Phoenix被Salesforce.com内部使用,对于简单的低延迟查询,其量级为毫秒;对于百万级别的行数来说,其量级为秒。Phoenix并不是像HBase那样用于map-reduce job的,而是通过标准化的语言来访问HBase数据的。

根据项目创建者所述,对于10M到100M的行的简单查询来说,Phoenix要胜过Hive。对于使用了HBase API、协同处理器及自定义过滤器的Impala与OpenTSDB来说,进行相似的查询Phoenix的速度也会更快一些。

Phoenix查询引擎会将SQL查询转换为一个或多个HBase scan,并编排执行以生成标准的JDBC结果集。直接使用HBase API、协同处理器与自定义过滤器,对于简单查询来说,其性能量级是毫秒,对于百万级别的行数来说,其性能量级是秒。

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

  • 嵌入式的JDBC驱动,实现了大部分的java.sql接口,包括元数据API
  • 可以通过多部行键或是键/值单元对列进行建模
  • 完善的查询支持,可以使用多个谓词以及优化的扫描键
  • DDL支持:通过CREATE TABLE、DROP TABLE及ALTER TABLE来添加/删除列
  • 版本化的模式仓库:当写入数据时,快照查询会使用恰当的模式
  • DML支持:用于逐行插入的UPSERT VALUES、用于相同或不同表之间大量数据传输的UPSERT SELECT、用于删除行的DELETE
  • 通过客户端的批处理实现的有限的事务支持
  • 单表——还没有连接,同时二级索引也在开发当中
  • 紧跟ANSI SQL标准

Phoenix代码基于BSD许可开源。

下面是InfoQ采访Phoenix主开发者James Taylor的访谈内容。

InfoQ:为何要为Non-SQL数据存储提供SQL接口?现在已经有很多其他的SQL解决方案了。

JT:现有的SQL解决方案通常都不是水平可伸缩的,因此当数据量变大时会遇到阻碍。至于我们为何在NoSQL数据存储HBase上提供SQL接口,有如下几个原因:

  1. 使用诸如SQL这样易于理解的语言可以使人们能够更加轻松地使用HBase。相对于学习另一套私有API,人们可以使用熟悉的语言来读写数据。
  2. 使用诸如SQL这样更高层次的语言来编写减少了你所需编写的代码量。比如说,使用Phoenix,你可以编写下面这样的查询来获取Web的统计数据(我不想说使用原生的HBase API会有多少行代码,但肯定少不了):
    • SELECT
      • TRUNC(DATE,’DAY’) DAY,
      • SUM(CORE) TOTAL_CPU_Usage,
      • MIN(CORE) MIN_CPU_Usage,
      • MAX(CORE) MAX_CPU_Usage
    • FROM WEB_STAT
    • WHERE DOMAIN LIKE ‘Salesforce%’
    • GROUP BY TRUNC(DATE,’DAY’);
  3. 执行查询时,在数据访问与运行时执行之间加上SQL这样一层抽象可以进行大量优化。比如说,对于GROUP BY查询来说,我们可以利用HBase中协同处理器这样的特性。借助于该特性,我们可以在HBase服务器上执行Phoenix代码。因此,聚合可以在服 务端执行,而不必在客户端,这么做会极大减少客户端与服务端之间传输的数据量。此外,Phoenix还会在客户端并行执行GROUP BY,这是根据行键的范围来截断扫描而实现的。通过并行执行,结果会更快地返回。所有这些优化都无需用户参与,用户只需发出查询即可。
  4. 通过使用业界标准的API(如JDBC),我们可以利用现有的工具来使用这些API。比如说,你可以使用现成的SQL客户端(如SQuirrel,http://squirrel-sql.sourceforge.net/)连接HBase服务器并执行SQL。感兴趣的读者可以参见入门指南以了解更多信息:https://github.com/forcedotcom/phoenix/blob/master/README.md

InfoQ:有没有性能评估呢?响应时间是否变快了?可伸缩性是否更好了?

JT:可以在这里https://github.com/forcedotcom/phoenix/wiki/Performance了 解Phoenix与其他NoSQL产品/项目的性能对比。我们并没有发布Phoenix与现有的关系型技术之间的基准比较(网上已经有了HBase与他们 之间的比较),但当行数与行宽增加时,NoSQL解决方案会更出众。这也取决于你是“如何”使用关系数据库的:是像Salesforce.com那样的多 租模式抑或单租模式。HBase非常善于协同定位关系数据,这取决于行键是如何构成的,因此对于某些多租场景来说,其优势是很明显的。

InfoQ:何时才会增加连接支持呢?

JT:连接支持已经在我们的路线图上了,参见https://github.com/forcedotcom/phoenix/wiki#wiki-roadmap。我们已经在做一些基础工作了,现在还不能给出准确的时间点,因为有太多事情要做,但我们会尽快的。

查看英文原文:Phoenix: Running SQL Queries on Apache HBase

译者 张龙 热衷于编程,乐于分享,对新技术有强烈的探索欲,对Java轻量级框架有一定研究。

This entry was posted in DB, OS. Bookmark the permalink.

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s