博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HBase - Phoenix剖析
阅读量:6868 次
发布时间:2019-06-26

本文共 3174 字,大约阅读时间需要 10 分钟。

1.概述

  在《》一文当中,给大家介绍了Drill的相关内容,就实时查询来说,Drill基本能够满足要求,同时还可以做一个简单业务上的聚合,如果在使用Hive做一些简单的业务统计(不涉及多维度,比如CUBE,ROLLUP之类的函数),只是用一些基本的聚合函数或是JOIN ON之类的,Drill基本满足要求,而且响应速度可比OLTP。今天给大家剖析的是另外一种工具,由于目前Drill官方不支持对表的插入,更新操作。所以,在操作HBase的时候,若遇到这些需求,Drill就有点力不从心。那么,Phoenix可以满足以上需求。它更接近与标准的SQL。

2.Architecture

  在Phoenix中SQL Query Plan的执行,基本上是通过构建一系列的HBase Scan来完成。为了尽可能减少数据的传输,在Region Server使用Coprocessor来尽可能的执行Aggregate相关的工作,基本实现的思路是使用RegionObserver在PostScannerOpen Hook中将RegionScanner替换成支持Aggregation工作的定制化的Scanner,具体的Aggregate操作通过Custom的Scan属性传递给RegionScanner。然与基于MapReduce的框架执行Plan的思想比较,基本上就是通过Coprocessor,使用RegionServer自身来在各个节点上执行Aggregation。另外,通过各种定制的Filter在HBase的RegionScanner Scan过程中,尽早的将不相关的数据过滤掉。采用JDBC接口和应用程序交互。

3.Grammar

  本篇博客所对应的软件版本号,如下所示:

  • HBase:0.98
  • Phoenix:4.6-HBase-0.98

  这里需要注意的是,Phoenix的版本是和HBase版本相匹配的,可以在Phoenix的官网选择对应的HBase版本。就本篇博客截止,官方所支持的语法如下图所示:

3.How to use

  如何将Phoenix嵌入到现有业务当中,其实,Phoenix只是一个中间件(或是一个HBase的SQL插件),它的使用较为简单,首先,我们准备好对应的安装包,下载地址如下所示:

  • [Phoenix-HBase-0.98][]

  然后,将Phoenix目录下的phoenix-*.jar拷贝到HBase的lib目录,这里面是将所有的插件均拷贝到HBase了,若是只使用个别插件,大家可按需选择即可。然后重启HBase集群即可。

3.1 Shell Client

  这里,我们可以验证Phoenix是否可用,可以通过终端来验证,在Phoenix的bin目录当中有一个sqlline.py脚本,可以通过该脚本来操作HBase中的表,命令如下所示:

./sqlline.py zk01,zk02,zk03:2181

  通过英文感叹号可以获取帮助命令,如下图所示:

  然后,我们可以做一些测试来,验证起可用性。如下图所示:

  脚本如下所示:

1
2
3
4
5
6
7
create 
table 
test3 (mykey 
integer 
not 
null 
primary 
key
, mycolumn 
varchar
);
upsert 
into 
test3 
values 
(1,
'Hello'
);
upsert 
into 
test3 
values 
(2,
'World2'
);
upsert 
into 
test3 
values 
(3,
'World3'
);
upsert 
into 
test3 
values 
(4,
'World4'
);
upsert 
into 
test3 
values 
(5,
'World5'
);
select 
from 
test3;

3.2 JDBC

  另外,Phoenix也支持JDBC去访问,这里笔者给大家写了一个示例代码,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package 
cn.smrtloli.phoenix.demo;
 
import 
java.sql.Connection;
import 
java.sql.DriverManager;
import 
java.sql.ResultSet;
import 
java.sql.SQLException;
import 
java.sql.Statement;
 
/**
 
* @Date Dec 14, 2015
 
*
 
* @Author dengjie
 
*
 
* @Note TODO
 
*/
public 
class 
PhoenixDemo {
    
private 
static 
String driver = 
"org.apache.phoenix.jdbc.PhoenixDriver"
;
 
    
public 
static 
void 
main(String[] args) 
throws 
SQLException {
        
try 
{
            
Class.forName(driver);
        
catch 
(ClassNotFoundException e) {
            
e.printStackTrace();
        
}
        
Statement stmt = 
null
;
        
ResultSet rset = 
null
;
 
        
Connection con = DriverManager.getConnection(
"jdbc:phoenix:zk01,zk02,zk03:2181"
);
        
stmt = con.createStatement();
        
String sql = 
"select * from test3"
;
        
rset = stmt.executeQuery(sql);
        
while 
(rset.next()) {
            
System.out.println(rset.getString(
"mycolumn"
));
        
}
        
stmt.close();
        
con.close();
    
}
}

  另外,在pom.xml中添加如下依赖JAR文件,内容如下所示:

org.apache.phoenix
phoenix-core
4.6.0-HBase-0.98

  运行结果,如下所示:

4.总结

  就使用的结果来看,虽然满足了一些CRUD的操作,然其在HBase的基础上完成,过于依赖HBase,对其他存储介质的支持有限。总体来说,对于HBase中已有数据,做标准的SQL操作来说,是足够了。另外,时延要求较高的业务,还是用HBase的API来完成,Phoenix虽说速度、性能较快,毕竟不能严格意义上达到OLTP。

5.结束语

  这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

联系方式: 
邮箱:smartloli.org@gmail.com 
Twitter:  
QQ群(Hadoop - 交流社区1):  
温馨提示:请大家加群的时候写上加群理由(姓名+公司/学校),方便管理员审核,谢谢! 

热爱生活,享受编程,与君共勉!

本文转自哥不是小萝莉博客园博客,原文链接:,如需转载请自行联系原作者

你可能感兴趣的文章
scala ide
查看>>
mysql存储过程简单学习
查看>>
kvm安装
查看>>
对你同样重要的非技术贴,10件事证明你跟错了人
查看>>
CentOS 6.5安装JDK
查看>>
一个文件的某一列写入到另一个文件的行中shell与python
查看>>
大龄码农经验那么丰富,为什么很多公司都不招?
查看>>
几种典型应用对系统资源使用的特点
查看>>
BPM领域常用的两款工作流JBPM和CCBPM的对比
查看>>
负载均衡方案
查看>>
Shell脚本易犯的错
查看>>
基于邮件和百度云存储的android用户反馈系统设计
查看>>
Elasticsearch Sliced Scroll分页检索案例分享
查看>>
【腾讯Bugly干货分享】Redex初探与Interdex:Andorid冷启动优化
查看>>
DDD领域模型和持久模型的实施方式(不定期更新ing)
查看>>
freebsd下“find”命令详解
查看>>
“开发测试”降低软件开发中的风险(转)
查看>>
聊聊FluxFlatMap的concurrency及prefetch参数
查看>>
如何对多个版本的Word文档对比,查找变动删减的内容
查看>>
PHP MEMCACHE 详解 php缓存
查看>>