Phoenix是构建在HBase之上的关系型数据库层,作为内嵌的客户端JDBC驱动用以对HBase中的数据进行低延迟访问
Phoenix会将用户编写的sql查询编译为一系列的scan操作,最终产生通用的JDBC结果集返回给客户端
Phoenix可以看成是mysql
准备安装包
apache-phoenix-4.12.0-HBase-1.2-bin.tar.gz
解压Phoenix
tar -zxvf apache-phoenix-4.12.0-HBase-1.2-bin.tar.gz
改下名字
mv apache-phoenix-4.12.0-HBase-1.2-bin phoenix-4.12.0
看下目录结构
将jar拷贝到hbase的lib目录下
phoenix-4.12.0-HBase-1.2-client.jar
phoenix-core-4.12.0-HBase-1.2.jar
cp phoenix-4.12.0-HBase-1.2-client.jar /opt/bigdata/hbase-1.2.1/lib/
cp phoenix-core-4.12.0-HBase-1.2.jar /opt/bigdata/hbase-1.2.1/lib/
重启hbase服务,让配置生效
找到hbase-site.xml文件,将hbase/conf下的hbase-site.xml文件拷贝到Phoenix/bin目录下覆盖掉,或者直接修改
hbase.tmp.dir
/opt/bigdata/hbase-1.2.1/data
hbase.rootdir
hdfs://masterhbase:8082/hbase
hbase.cluster.distributed
true
hbase.zookeeper.quorum
masterhbase,masterslave1,masterslave2
zookeeper.znode.parent
/hbase
hbase.regionserver.wal.codec
org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec
安装工具
yum -y install python-argparse
启动Phoenix:指定ZK的地址以及端口号,作为hbase的访问入口
bin/sqlline.py masterhbase:2181
在HBase中输入list,会发现多一些表
语句大多数类似mysql语句,但是没有show database table list都不行 用help帮助信息
!tables 当前phoenix的系统表,hbase中也会有这些表,表示关联成功一半
创建表
CREATE TABLE user (
id varchar PRIMARY KEY,
name varchar ,
passwd varchar
);
在HBase Shell中可以看到
hbase区分大小写
Phoenix不区分大小写,默认情况下都是大写,变小写加上双引号就可以
在hbase的shell中:describe 'USER' 查看
得知默认列族为0,id主键字段对应到hbase的ROW字段
phoenix插入数据: updata+insert结合(upsert)更新数据与这个语句是一样的
upsert into user(id, name, passwd) values('001', 'admin', 'admin');
在HBase Shell中查看
scan 'USER'
phoenix删除表
drop table user;
phoenix指定列族
CREATE TABLE user (
id varchar PRIMARY KEY,
INFO.name varchar ,
INFO.passwd varchar
);
在hbase shell中查看
phoenix查询语句:
select * from user;
select name from user where id ='001';
phoenix删除语句:
delete from user where id='001';
在phoenix的CLI界面中进行简单的CRUD操作,基本上与RDBMS的操作没有太大区别。
hbase与phoenix表与表进行关联
在phoenix中:列的顺序可以不一致,表名称必须一致,以及列名称一致
在HBase中有一张表
我们在phoenix做映射创建
create table "stu_info_importtsv"(
"ROW" varchar primary key,
"f1"."location" varchar,
"f2"."age" varchar,
"f1"."name" varchar,
"f3"."addr" varchar
);
查看下数据
回到hbase中会发现一些变化,不会影响,可忽略
phoenix数据类型:
char
varchar
decimal
tinyint
smallint
integer
bigint
float
double
timestamp
date
time
binary
varbinary
phoenix导入csv文件数据(批量):
注意:要加载的所有CSV文件都必须具有".csv"文件扩展名
另外phoenix也支持mr做一个批量数据导入
Phoenix创建表
create table if not exists bulkdata (
state char(2) not null,
city varchar not null,
population bigint
constraint my_pk primary key (state, city)
);
准备数据
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
如果没有指定表的名称,他根据文件名称来找对应的表
(bin/psql.py masterhbase /data/phoeniximport.csv 没有指定表名称)
bin/psql.py -t BULKDATA masterhbase /data/phoeniximport.csv
查询数据
如果使用sql文件
执行语句
/opt/bigdata/phoenix-4.12.0/bin/psql.py /data/testphoenix.sql
查看表也是有的
我们看下HBase中
主键就是hbase对应的rowkey,为了防止hbase主键的唯一性,可以设置多个字段为主键
这个表就是多个字段的主键
在hbase中添加数据和phoenix添加数据的不同:
添加数据
upsert into bulkdata(state, city, population) values('NY', 'admin', 212313);
查看下
再添加
put 'BULKDATA','41','0:population','2222'
put 'BULKDATA','41','0:city','SHANGHAI'
put 'BULKDATA','41','0:state','tom'
查看下
但是在phoenix中没有
总结:
首先,这张表是在phoenix中创建
在phoenix中更新数据,hbase也会更新
在hbase中更新数据,phoenix是不会更新的
一些小补充:
1、phoenix JAVA API也可以
phoenix-4.12.0-HBase-1.2-client.jar
phoenix-core-4.12.0-HBase-1.2.jar
添加到项目的classpath中,代码风格类似JDBC,这个网上很多,不做过多练习。
2、一个第三方工具
使用Squirrel GUI客户端来连接phoenix
就像MySQL使用Navicat for MySQL,小海豚一样的连接工具,在进行一些数据库操作的时候能够更加的直观和方便
将下载的jar文件双击进行安装,直接下一步即可
将phoenix-4.12.0-HBase-1.2-client.jar拷贝到squirrel安装目录的lib目录下。
启动:进入Drivers标签页创建新的Driver (加号)
参数说明:
Name:hbasetest(可以填写其他名称)
ExampleURL:填写HBase集群的zookeeper集群的连接信息,这里是jdbc:phoenix:hbasemaster:2181
Website URL:这里不填写
Java Class Path:选择phoenix-4.2.2-client.jar(是否选中无所谓,只要在Java Class Path里面就行)
进入Aliases标签页创建新的Alias(加号)
参数说明:
Name:hbasemaster(可以填写其他名称)
Driver:选择ibeifeng.class,即上一步创建的Driver
URL:这里就是HBase集群的zookeeper的连接ip和port
User Name:随便填写
Password:随便填写
在Aliases标签中双击刚刚创建的phoenix打开连接
点击SQL标签进入sql命令行界面,输入语句执行(小人走路的是执行按钮)
练习语句
create table if not exists mytable (
id integer primary key,
name varchar,
sex varchar,
address varchar
);
upsert into mytable values (1, 'wxb', 'male', '010-22222222');
upsert into mytable values (2, 'll', 'male', '010-11111111');
select * from mytable;
select * from "stu_info"
依然注意大小写
在SQuirrel中,执行sql语句时,按Ctrl + Enter键就可以执行了