phoenix虽然是构建在hbase层之上,但是由于以下特点,不会影响查询性能,反而会提高性能
编译SQL查询为原生HBase的scan语句检测scan语句最佳的开始和结束的key精心编排你的scan语句让他们并行执行让计算去接近数据推送你的WHERE子句的谓词到服务端过滤器处理执行聚合查询通过服务端钩子(称为协同处理器)phoenix还提供了一些增强优化性能
实现了二级索引来提升非主键字段查询的性能统计相关数据来提高并行化水平,并帮助选择最佳优化方案跳过扫描过滤器来优化IN,LIKE,OR查询优化主键来均匀分布写压力phoenix不能做的事情
不支持事务处理不支持复杂的条件1、上传、解压、更名、环境变量 2、将phoenix目录下的phoenix-4.13.1-HBase-1.2-client.jar 和phoenix-core-4.13.1-HBase-1.2.jar两个jar包拷贝到hbase下的lib目录下,要分发到集群其他机器上 3、配置hbase-site.xml 添加以下内容:
<property> <name>phoenix.schema.isNamespaceMappingEnabled</name> <value>true</value> </property> <property> <name>phoenix.schema.mapSystemTablesToNamespace</name> <value>true</value> </property> <property> <name>hbase.table.sanity.checks</name> <value>false</value> </property>hbase-site.xml也要分发到集群其他机器上 4、配置phoenix的bin下的hdfs-site.xml(可以用hbase下的hbase-site.xml覆盖,也可自己配置,将上面的配置添加进去即可) 5、启动即可(sqlline.py)
启动phoenix时提示以下错误,(phoenix可以正常进去,但不能使用。不能查看表等等)
Error: ERROR 726 (43M10): Inconsistent namespace mapping properties.. Ensure that config phoenix.schema.isNamespaceMappingEnabled is consitent on client and server. (state=43M10,code=726)解决办法: 将配置完毕的hbase-site.xml分发到其他节点上。
使用 sqlline.py脚本登录到phoenix的客户端 在此界面使用hlep命令就可以看到phoenix所有的操作命令
指的是在linux命令行使用 psql.py [zookeeper host:port] filename 方式将文件中的命令以phoenix执行
例如:
首先创建createtable.sql文件,里面添加l两个建表语句,表名分别是us_population和ak_population
[root@qianfeng01 phoenix]# vi ./sql/createtable.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) ); CREATE TABLE IF NOT EXISTS ak_population ( state CHAR(2) NOT NULL, city VARCHAR NOT NULL, population BIGINT CONSTRAINT my_pk PRIMARY KEY (state, city) );接下来新建一个数据文件us_population.csv
要加载的所有CSV文件都必须具有".csv"文件扩展名,同样phoenix也支持mr做一个批量数据导入,主键就是hbase对应的rowkey,为了保证hbase主键的唯一性,可以设置多个字段为主键。
注意: 根据文件名称来找对应的表名
[root@qianfeng01 phoenix]# vi ./sql/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创建一个ak.csv 通过-t参数指定表名
[root@qianfeng01 phoenix]# vi ./sql/ak.csv AK,kenai,450283 AK,haines,370283 AK,fairbanks,390283执行命令为:psql.py [zkserver:port] filepath……
-- 可以使用批处理命令,来执行多个文件 [root@qianfeng01 phoenix]# psql.py ./sql/createtable.sql ./sql/us_population.csv -- 会出现异常,因为在导入数据时,文件名必须要和表名一致。 [root@qianfeng01 phoenix]# psql.py ./sql/ak.csv java.lang.IllegalArgumentException: Table AK not found -- 更名后,再次导入 [root@qianfeng01 phoenix]# mv ./sql/ak.csv ./sql/ak_population.csv [root@qianfeng01 phoenix]# psql.py ./sql/ak_population.csv --在phoenix命令行上检查表的数据 select * from us_population; select * from ak_population;创建一个查询sql文件queries.sql
[root@qianfeng01 phoenix]# vi ./sql/queries.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 [zkserver:port] filepath……
[root@qianfeng01 phoenix]# psql.py ./sql/queries.sql ST CITY POPULATION -- ---------------------------------------- ---------------------------------------- AK fairbanks 390283 AK haines 370283 AK kenai 450283 Time: 0.067 sec(s) ST CITY POPULATION -- ---------------------------------------- ---------------------------------------- AZ Phoenix 1461575 CA Los Angeles 3844829 CA San Diego 1255540 CA San Jose 912332 IL Chicago 2842518 NY New York 8143197 PA Philadelphia 1463281 TX Dallas 1213825 TX Houston 2016582 TX San Antonio 1256509 Time: 0.036 sec(s)注意:
1、通过Phoenix建的表都会自动转成大写,如果需要使用小写的表,请使用create table “tablename”
2、安装了Phoenix之后,系统会自动生成四张系统表
3、在Phoenix中创建的表同时会在HBase中创建一张表与之对应,并且需要使用psql.py脚本加载数据
通过IDEA连接 phoenix能支持sql语句,同样我们也可以使用jdbc来连接phoenix发送sql语句操作hbase。
引入phoenix的依赖
<!--加入phoenix的相关依赖--> <dependencies> <dependency> <groupId>org.apache.phoenix</groupId> <artifactId>phoenix-core</artifactId> <version>4.13.1-HBase-1.2</version> </dependency> </dependencies> </project>查询代码
package edu.qf; import java.sql.*; import java.util.Properties; /** * 使用phoenix的api操作 */ public class PhoenixJDBC { //定义驱动类 private static final String phoenix_driver = "org.apache.phoenix.jdbc.PhoenixDriver"; public static void main(String[] args) { //定义conn、语句、结果集 Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //加载驱动 Class.forName(phoenix_driver); //client端配置Namespace属性,否则会报错,因为服务端配置咯的 Properties pro = new Properties(); pro.setProperty("phoenix.schema.isNamespaceMappingEnabled","true"); //获取连接 conn = DriverManager.getConnection("jdbc:phoenix:qianfeng01,qianfeng02,qianfeng03:2181", pro); //定义sql String sql = "select * from US_POPULATION"; ps = conn.prepareStatement(sql); //执行 rs = ps.executeQuery(); //取值 while (rs.next()){ System.out.println(rs.getString(1)+"\t"+rs.getString(2) +"\t"+rs.getString(3)); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { //关闭连接 try { conn.close(); ps.close(); rs.close(); } catch (SQLException e) { //do nothing } } } }查询结果
不好用,不说了
请移步http://phoenix.apache.org/language/datatypes.html 测试 但是实际使用中,建议如果要关联已有的HBase表,最好直接使用VARCHAR类型
phoenix的插入关键语句是 upsert into 或者upsert into……. select ………….
案例演示: upsert into student values(1001,'zhangsan',23,1000.0); upsert into student (id,name,age)values(1002,'lisi',24); upsert into student (id,name,age,salary)values(1003,'wangwu',25,1100.0); upsert into student (id,name,age,salary)values(1004,'zhaoliu',25,1100.0); 案例演示:要插入的数据来源于另外一张表 create table student1( id integer primary key, name varchar(20), age integer, salary double ); upsert into student1 select * from student; upsert into student1(id,name,age) select id,name,age from student where id>1002; 注意事项: 主键约束的字段一定要有值。 多次插入操作,如果主键字段的值相同,其实是hbase的覆盖操作。