15分钟了解Apache Phoenix(HBase的开源SQL引擎)

来源:互联网 发布:淘宝卖家如何提前收款 编辑:程序博客网 时间:2024/05/29 18:17

什么是Phoenix?

Phoenix是一个Hbase的开源SQL引擎。你可以使用标准的JDBC API代替hbase客户端API来创建表,插入数据,查询你的HBase数据。

不要在我的程序和HBase之间增加额外的层,它只会拖慢速度的?

事实上,不会。Phoenix通过以下方式实现了比你自己手写的方式相同或者可能是更好的性能(更不用说可以少写了很多代码): 
* 编译你的SQL查询为原生HBase的scan语句 
* 检测scan语句最佳的开始和结束的key 
* 精心编排你的scan语句让他们并行执行 
* 让计算去接近数据通过 
* 推送你的WHERE子句的谓词到服务端过滤器处理 
* 执行聚合查询通过服务端钩子(称为协同处理器)

除此之外,我们还做了一些有趣的增强功能来更多地优化性能: 
* 实现了二级索引来提升非主键字段查询的性能 
* 统计相关数据来提高并行化水平,并帮助选择最佳优化方案 
* 跳过扫描过滤器来优化IN,LIKE,OR查询 
* 优化主键的盐值来均匀分布写压力

好吧,它很快。但是为什么要用SQL?这已经是70年代的东西了。

一种观点是:给大伙儿一些他们已经熟悉的东西吧。什么是更好的方式去激励他们使用HBase呢?最好的方式就是使用JDBC和SQL,原因有以下几点: 
* 降低用户需要写的代码的数量 
* 让性能优化对用户透明 
* 方便利用和整合大量的已经存在的工具

但是怎样才能让SQL支持我最喜爱的HBase的某些技术

不要把这(使用Phoenix后)当作是你见HBase的最后一次好吧?SQL只是一种表达你想实现的功能的方式,你不必去思考怎样用SQL去实现功能(原文是SQL is just a way of expressing what you want to get not how you want to get it)。针对目前已经存在或者正在做的Phoenix功能,看看能否支持你喜欢的HBase的特殊用法。你有自己的想法?我们很乐意听到你的想法:把问题写下来给我们同时也可以加入我们的邮件列表。

说了这么多,我只是想知道如何开始?

非常棒!只要跟随我们的安装指南: 
* 下载并解压我们的安装包 
* 拷贝能够与你的Hbase安装兼容的phoenix的服务端jar包到每个集群节点的lib目录 
* 重启你的集群节点 
* 添加phoenix的客户端jar包到你的HBase客户端的classpath下 
* 下载并设置SQuirrel作为你的SQL客户端,这样你就可以发起即时查询的SQL语句来操作你的HBase集群

我不想要下载安装其他东西了!

好吧,有道理 - 你可以创建你自己的SQL脚本并使用我们的命令行工具来执行他们(来代替前面说的下载安装软件的方案)。现在让我们来看一个例子。 
定位到你安装Phoenix路径的bin目录来开始。

  • 首先,让我们来创建一个us_population.sql的文件,包含一个表的定义过程:
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));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 现在让我们创建一个us_population.csv文件,包含一些要放到表里的数据:
NY,New York,8143197CA,Los Angeles,3844829IL,Chicago,2842518TX,Houston,2016582PA,Philadelphia,1463281AZ,Phoenix,1461575TX,San Antonio,1256509CA,San Diego,1255540TX,Dallas,1213825CA,San Jose,912332
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 最后,让我们创建一个us_population_queries.sql文件,包含一个我们想在哪些数据上做的查询。
SELECT state as "State",count(city) as "City Count",sum(population) as "Population Sum"FROM us_populationGROUP BY stateORDER BY sum(population) DESC;
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
  • 在命令行终端上执行下面的命令
./psql.py <your_zookeeper_quorum> us_population.sql us_population.csv us_population_queries.sql
  • 1
  • 1

祝贺!你已经创建了你的第一个Phoenix表了,插入数据进去,并且执行了一个只有几行数据的聚合查询代码,在15分钟以内!

了不起 - 10行数据!还获得了什么?

好吧,真是难对付的人。查看一下我们的bin/performance.py脚本,针对你提出的数据库模式,去创建你想要的行数的数据,然后运行耗时的查询。

为什么要叫Phoenix(凤凰)呢?是不是之前有其他什么项目崩溃或者烧毁,然后这个是它的下一代版本?

很抱歉,但是我们没有时间和空间了,所以我们下次再来回答这个问题。

原创粉丝点击