Apache Phoenix 入门
概述
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的版本号需要兼容
Phoneix安装
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 集群
在 Linux shell中操作
在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户端操作
SQuirreL Java程序编写的DB客户端程序,允许通过SQL查看数据库内容、执行SQL等。
1. 下载
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
Java 编程,借力JdbcTemplate
这里以SpringBoot项目结合JdbcTemplate展示如何来使用。
1. 创建SpringBoot项目,依赖如下
<dependencies> <!-- 纠正版本 --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>13.0.1</version> </dependency> <!-- 必须,且版本要对应 --> <dependency> <groupId>org.apache.phoenix</groupId> <artifactId>phoenix-core</artifactId> <version>4.10.0-HBase-1.1</version> <scope>runtime</scope> <exclusions> <exclusion> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> <!-- JDBC --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> </dependencies>
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<ItInfo> 结构
@SpringBootApplication publicclass PhoneixApplication { public static void main(String[] args)throws Exception { ConfigurableApplicationContextcontext = SpringApplication.run(PhoneixApplication.class, args); JdbcTemplate jdbc =context.getBean(JdbcTemplate.class); List<ItInfo> itInfos =jdbc.query("select * from itinfo", newBeanPropertyRowMapper<ItInfo>(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