Phoenix:Put the SQL back in NoSQL

你是否已经冲入了大数据的浩瀚海洋,然后在里面跌宕起伏,遇坑无数?你是否被一堆API,接口,命令,文档而折磨?初入大数据不禁让我们感叹一声,这玩意儿不好搞啊!

今天我就来介绍一个可以让我们十五分钟就能使用分布式列式数据库HBase的工具:Phoenix。这真的不是我标题党,绝非十五分钟从入门到跑路,从跑路到删库。


Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs而不是HBase客户端APIs来创建表,插入数据和对HBase数据进行查询。

注:Hive和Impala也可以对HBase进行查询,但是Phoenix在HBase上的性能远超他们,对于简单查询来说,Phoenix的性能量级是毫秒,对于百万级别的行数来说,性能量级是秒


Phoenix为啥这么厉害,见标题:Phoenix,Put the SQL back in NoSQL。这里的NoSQL特指HBase。啥意思呢,就是Phoenix又把sql语句放回HBase里面了。我们知道HBase不支持SQL语句,我们想去操作HBase的时候要么通过HBase的shell要么通过通过他提供的Java API等等。而Phoenix可以让我们通过我们非常熟悉的SQL语句对HBase进行操作,同时提供标准的JDBC API可以让我们通过编程来使用HBase。JDBC我们不能再熟悉了,有了他我们就可以像操作mysql数据库一样来操作HBase,这个门槛不是低了一点半点啊。而且还可以将Phoenix和mybatis相结合更加方便快捷的开发我们的业务。Phoenix更加厉害的是它本身具有很多的特性,比如完整的事务,二级索引,高性能等等,我们后续会逐个介绍。这篇文章我们主要介绍一下Phoenix的安装和基本使用。

Phoenix安装

下载Phoenix的安装包,比如我的HBase版本为1.2.4,所以我这里选择HBase1.2的Phoenix,大家这里要注意与你部署的HBase版本一致。HBase伪分布式集群搭建大家可以参考我的另外一篇手记《HBase伪分布式集群安装》。

下载完成之后我们将其解压:

cd phoenix_download_dir  # 跳转到下载目录
tar zxvf phoenix_tar_gz # 解压缩
mv phoenix_dir dest_path # 移动到我们想要安装的位置
图片描述
图片描述

Phoenix的安装非常之简单,我们只需要将相关的jar包拷贝到hbase的classpath(即HBASE_HOME/lib目录下)即可。
我们需要拷贝phoenix-[version]-HBase-1.2-server.jarphoenix-core-[version]-HBase-1.2.jar

cp phoenix-4.13.1-HBase-1.2-server.jar HBASE_HOME/lib/
cp phoenix-core-4.13.1-HBase-1.2.jar HBASE_HOME/lib/

我们列出一下HBase的lib目录下关于Phoenix的jar包。

图片描述
图片描述

好,我们的Phoenix已经安装完成了,接下来我们重新启动我们的hbase就可以了。

cd HBASE_HOME/bin # 跳转到HBase的执行目录
./start-hbase.sh
./start-hbase.sh
图片描述
图片描述

使用Phoenix

我们安装完Phoenix之后应该如何来使用它呢?我们先来看一下官方的示例

批处理方式

首先我们新建一个名为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));

然后新建一个csv类型的数据文件us_population.csv

NY,New York,8143197
CA,Los Angeles,3844829
IL,Chicago,2842518
TX,Houston,2016582
PA,Philadelphia,1463281
AZ,Phoenix,1461575
TX,San Antonio,1256509
CA,San Diego,1255540
TX,Dallas,1213825
CA,San Jose,912332

然后我们再添加一下我们查询所需要的sql语句,新建一个us_population_queries.sql文件,我们进行了查询,聚合等常见是SQL操作:

SELECT state as "State",count(city) as "City Count",sum(population) as "Population Sum"
FROM us_population
GROUP BY state
ORDER BY sum(population) DESC;

最后我们通过./psql.py来测试一下Phoenix:

# <your_zookeeper_quorum> 为你zookeeper的地址,我这是添加的是127.0.0.1:2181
./psql.py <your_zookeeper_quorum> us_population.sql us_population.csv us_population_queries.sql

大家可以看到相关的执行结果:


图片描述
图片描述

我的天啊!这么神奇吗?我写了一条sql,还有聚合操作在HBase上居然执行成功了?

命令行方式

我们先来看一下我们平常是如何使用HBase的。我们想通过命令行的方式使用HBase的话,首先要调用它的shell。

cd HBASE_HOME/bin
./hbase shell
图片描述
图片描述

我们可以输入help来查看相关的命令介绍。常用命令会在文末给出。首先我们执行list查看hbase中所有的表。然后获取刚刚我们创建的表US_POPULATION的数据。

list
scan 'US_POPULATION'
图片描述
图片描述

图片描述
图片描述

如果我们对HBase不熟悉的话直接操作HBase的shell还是有一定的难度的,我们这里只是展示了最简单的命令,还有查询,过滤等等,当你用到的时候你会感觉很崩溃。那么我们怎么使用SQL去检索我们需要的数据呢?

这里我们就用到了Phoenix的命令行方式,我们调用Phoenix安装目录bin文件夹下的sqlline.py

./sqlline.py <your_zookeeper_quorum>
图片描述
图片描述

Phoenix也有一些特殊的命令,这部分命令需要前面加上感叹号!来执行,我们会在文末介绍。我们同样的来查看一下我们的表,然后查询一下数据。

!tables # 查看所有的表
select * from US_POPULATION; # 检索数据
图片描述
图片描述

看到SQL是不是倍感亲切,在这里,你可以使用sql对HBase里面的数据进行一系列的操作,常用的检索,过滤,聚合等等都可以支持。想不想立即部署一个Phoenix来试一下呢?
关于HBase和Phoenix更多信息大家可以观看我的实战课程《HBase+SpringBoot实战分布式文件存储》,里面有HBase的详细介绍和Phoenix的使用方式,包括命令行和Java JDBC调用,还有将Phoenix和Mybatis结合起来应用的实例。

附录:
HBase基础命令:

# HBase shell中的帮助命令非常强大,使用help获得全部命令的列表,使用help ‘command_name’获得某一个命令的详细信息
help 'status'
# 查询服务器状态
status
# 查看所有表
list
# 创建一个表
create 'FileTable','fileInfo','saveInfo'
# 获得表的描述
describe 'FileTable'
# 添加一个列族
alter 'FileTable', 'cf'
# 删除一个列族
alter 'FileTable', {NAME => 'cf', METHOD => 'delete'}
# 插入数据
put 'FileTable', 'rowkey1','fileInfo:name','file1.txt'
put 'FileTable', 'rowkey1','fileInfo:type','txt'
put 'FileTable', 'rowkey1','fileInfo:size','1024'
put 'FileTable', 'rowkey1','saveInfo:path','/home'
put 'FileTable', 'rowkey1','saveInfo:creator','tom'
put 'FileTable', 'rowkey2','fileInfo:name','file2.jpg'
put 'FileTable', 'rowkey2','fileInfo:type','jpg'
put 'FileTable', 'rowkey2','fileInfo:size','2048'
put 'FileTable', 'rowkey2','saveInfo:path','/home/pic'
put 'FileTable', 'rowkey2','saveInfo:creator','jerry'
# 查询表中有多少行
count 'FileTable'
# 获取一个rowkey的所有数据
get 'FileTable', 'rowkey1'
# 获得一个id,一个列簇(一个列)中的所有数据
get 'FileTable', 'rowkey1', 'fileInfo'
# 查询整表数据
scan 'FileTable'
# 扫描整个列簇
scan 'FileTable', {COLUMN=>'fileInfo'}
# 指定扫描其中的某个列
scan 'FileTable', {COLUMNS=> 'fileInfo:name'}
# 除了列(COLUMNS)修饰词外,HBase还支持Limit(限制查询结果行数),STARTROW(ROWKEY起始行。会先根据这个key定位到region,再向后扫描)、STOPROW(结束行)、TIMERANGE(限定时间戳范围)、VERSIONS(版本数)、和FILTER(按条件过滤行)等。比如我们从RowKey1这个rowkey开始,找下一个行的最新版本
scan 'FileTable', { STARTROW => 'rowkey1', LIMIT=>1, VERSIONS=>1}
# Filter是一个非常强大的修饰词,可以设定一系列条件来进行过滤。比如我们要限制名称为file1.txt
scan 'FileTable', FILTER=>"ValueFilter(=,'name:file1.txt’)"
# FILTER中支持多个过滤条件通过括号、AND和OR的条件组合
scan 'FileTable', FILTER=>"ColumnPrefixFilter('typ') AND ValueFilter ValueFilter(=,'substring:10')"
# 通过delete命令,我们可以删除某个字段,接下来的get就无结果
delete 'FileTable','rowkey1','fileInfo:size'
get 'FileTable','rowkey1','fileInfo:size'
# 删除整行的值
deleteall 'FileTable','rowkey1'
get 'FileTable',’rowkey1'
# 通过enable和disable来启用/禁用这个表,相应的可以通过is_enabled和is_disabled来检查表是否被禁用
is_enabled 'FileTable'
is_disabled 'FileTable'
# 使用exists来检查表是否存在
exists 'FileTable'
# 删除表需要先将表disable
disable 'FileTable'
drop 'FileTable'

Phoenix基础命令:

!help # 帮助,不知道怎么办就执行help就对了

!list # 列出正常的链接

!tables # 列出所有的表

!dbinfo # 列出数据库的信息

!describe # 列出表的描述

!quit # 退出命令行

Phoenix我们就简单介绍到这里了,这个真的是一个非常厉害的项目。大家对大数据有兴趣的话就关注一下吧。

希望对大家有所帮助~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容