Hbase适合存储大量的对关系运算要求低的NOSQL数据,受Hbase 设计上的限制不能直接使用原生的PAI执行在关系数据库中普遍使用的条件判断和聚合等操作。Hbase很优秀,一些团队寻求在Hbase之上提供一种更面向普通开发人员的操作方式,Apache Phoenix即是。
Phoenix 基于Hbase给面向业务的开发人员提供了以标准SQL的方式对Hbase进行查询操作,并支持标准SQL中大部分特性:条件运算,分组,分页,等高级查询语法。
注:不对Phoenix 架构做整体介绍,仅用示例来演示如何操作,如何在不同场景下使用。
ZK:host101,host102,host103
Hadoop:host102[主],host103[备],host104,host105,host106
Hbase:host102[备],host103[主],host104,host105,host106
Phoenix:host104[主]
注意事项: Hbase和Hadoop的版本号需要兼容
1. 下载: http://phoenix.apache.org/ 得到apache-phoenix-4.10.0-HBase-1.2-bin.tar.gz
2. 解压到主机host104 /app/ 路径下
3. 分发安装目录下phoenix-4.10.0-HBase-1.2-server.jar 文件到 Hbase 所有节点的安装目录下lib目录中.
4. 重启Hbase 集群
在Phoenix安装目录下bin子目录下执行 ./sqlline.py host101 进入Phoenix shell环境。
1. 创建表
create table itinfo(id varchar primary key,name varchar,ageinteger);
2. 列出表
!tables;
3. 插入一条数据
upsert into itinfo values('1001','itxiaofen',26);
修改数据多插入几条.
4. 查询全部数据,条件运算,排序,分组
select * from itinfo;
select * from itinfo where age>=27;
select * from itinfo order by age desc;
select age,count(1) from itinfo group by age ;
5. 登录Hbase shell查看有什么变化
Hbase安装目录下下执行bin/hbase shell
列出所有Hbase表执行list,经确认Phoenix帮我们在Hbase中做了很多事情,Hbase表的创建,数据插入等操作。以SYSTEM.开始的表为Phoenix的元数据表。
6. 总结一下,上次通过Phoenix提供的API以SQL的方式来操作Hbase表,Phoenix在集群中并行高校的拆分SQL调用Hbase API执行扫描和聚合操作,性能请参考Phoenix官网介绍
SQuirreL Java程序编写的DB客户端程序,允许通过SQL查看数据库内容、执行SQL等。
1. 下载
https://jaist.dl.sourceforge.net/project/squirrel-sql/3-snapshots/snapshot-20170703_2250/squirrel-sql-snapshot-20170703_2250-standard.jar 执行安装
2. 拷贝Phoenix 安装路径下phoenix-4.10.0-HBase-1.2-client.jar 到SQuirreL 安装目录下lib目录中。
3. 打开SQuirreL 安装路径下squirrel-sql.jar 启动应用
4. 关联驱动程序,单机Dirvers ->添加->扩展类路径 将phoenix-4.10.0-HBase-1.2-client.jar加入,执行List Drivers扫描驱动类, OK,如下
5. 单机Aliasses,添加选择上一步配置的驱动名称[蓝色为驱动可用]
jdbc:phoenix:host101等价于JDBC中的URL host101为ZK地址,单机Test 测试成功,确认后连接。
6. 查看表
7. 执行SQL
8. 总结,通过客户端可以方便的使用类似操作Oracle,MySQL的数据库的方式对待Hbase
这里以SpringBoot项目结合JdbcTemplate展示如何来使用。
1. 创建SpringBoot项目,依赖如下
com.google.guava
guava
13.0.1
org.apache.phoenix
phoenix-core
4.10.0-HBase-1.1
runtime
jdk.tools
jdk.tools
org.slf4j
slf4j-log4j12
org.springframework.boot
spring-boot-starter-jdbc
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-configuration-processor
true
2. 定义实体Bean
publicclass ItInfo {
private String id;
private String name;
private String age;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "ItInfo[id=" + id + ", name=" + name + ", age=" + age +"]";
}
}
3. application.yml ,配置Phoenix数据源信息
spring:
datasource:
url:jdbc:phoenix:host101,host102,host103:2181/hbase
driver-class-name:org.apache.phoenix.jdbc.PhoenixDriver
username:
password:
4. 主程序,查询全部的IiInfo表的对象并封装为List
@SpringBootApplication
publicclass PhoneixApplication {
public static void main(String[] args)throws Exception {
ConfigurableApplicationContextcontext = SpringApplication.run(PhoneixApplication.class, args);
JdbcTemplate jdbc =context.getBean(JdbcTemplate.class);
List itInfos =jdbc.query("select * from itinfo", newBeanPropertyRowMapper(ItInfo.class));
System.out.println(itInfos);
}
// 数据源
@Bean
@ConfigurationProperties(prefix ="spring.datasource")
public DataSource dataSource() {
returnDataSourceBuilder.create().type(DriverManagerDataSource.class).build();
}
// JdbcTemplate
@Bean
public JdbcTemplatejdbcTemplate(DataSource dataSource) {
return newJdbcTemplate(dataSource);
}
}
5. 总结一下,通过Phoenix 操作Hbase可以使用传统的JDBC的方式来处理Hbase中的数据,很多支持标准JDBC的优秀框架仍然适合于Phoenix