普陀网站建设哪家便宜,中天钢铁 网站建设,学校网站群建设必要,互联网公司排名500强名单目录
Phoenix Shell 操作
Phoenix JDBC 操作
Phoenix 二级索引 HBase整合Phoenix
Phoenix 简介
Phoenix 是 HBase 的开源 SQL 皮肤。可以使用标准 JDBC API 代替 HBase 客户端 API来创建表#xff0c;插入数据和查询 HBase 数据
使用Phoenix的优点
在 Client 和 HBase …目录
Phoenix Shell 操作
Phoenix JDBC 操作
Phoenix 二级索引 HBase整合Phoenix
Phoenix 简介
Phoenix 是 HBase 的开源 SQL 皮肤。可以使用标准 JDBC API 代替 HBase 客户端 API来创建表插入数据和查询 HBase 数据
使用Phoenix的优点
在 Client 和 HBase 之间放一个 Phoenix 中间层不会减慢速度Phoenix 对于用户输入的 SQL 有大量的优化手段
Phoenix 安装部署
1.下载并解压
官网地址Overview | Apache Phoenix
下载地址Phoenix Downloads | Apache Phoenix
下载好tar包之后上传到服务器上使用 tar -zxvf进行解压即可
2.server包配置
进入安装phoenix的路径下cd /opt/module/phoenix
找到server包 将其复制到hbase安装路径下的lib文件夹中并同步到其余所有节点上
3.配置环境变量
vim /etc/profile.d/my_env.sh自定义的环境变量文件
添加以下内容
#phoenix
export PHOENIX_HOME/opt/module/phoenix
export PHOENIX_CLASSPATH$PHOENIX_HOME
export PATH$PATH:$PHOENIX_HOME/bin
4.启动phoenix
首先需要重启hbase
然后启动phoenix
/opt/module/phoenix/bin/sqlline.py hadoop102,hadoop103,hadoop104:2181
出现以下界面说明启动成功 如果出现以下错误
警告: Failed to load history
java.lang.IllegalArgumentException: Bad history file syntax!
说明之前之前使用过phoenix存在历史记录删除/home/用户名路径下的.sqlline文件夹即可
我的路径就是/home/why/.sqlline
Phoenix Shell 操作
使用语法可以查看官网Grammar | Apache Phoenix
1.table
显示所有表
!table 或 !tables
创建表
指定单个列作为RowKey
CREATE TABLE IF NOT EXISTS student( id VARCHAR primary key, name VARCHAR, age BIGINT, addr VARCHAR); 在 phoenix 中表名等会自动转换为大写若要小写使用双引号如us_population。 指定多个列的联合作为 RowKey
CREATE TABLE IF NOT EXISTS student1 (
id VARCHAR NOT NULL,
name VARCHAR NOT NULL,
age BIGINT,
addr VARCHAR
CONSTRAINT my_pk PRIMARY KEY (id, name)); 注Phoenix 中建表会在 HBase 中创建一张对应的表。为了减少数据对磁盘空间的占用Phoenix 默认会对 HBase 中的列名做编码处理。具体规则可参考官网链接 Storage Formats | Apache Phoenix 若不想对列名编码可在建表语句末尾加上 COLUMN_ENCODED_BYTES 0; 插入数据
upsert into student values(1001,zhangsan, 10, beijing);
查询数据
select * from student;
select * from student where id1001;
删除数据
delete from student where id1001;
删除表
drop table student;
退出命令行
!quit
2.表的映射
默认情况下 HBase 中已存在的表通过 Phoenix 是不可见的。如果要在 Phoenix 中操作 HBase 中已存在的表可以在 Phoenix 中进行表的映射。映射方式有两种视图映射和表映射
创建hbase表
在hbase shell中创建表testcreate test,info1,info2
视图映射
在phoenix中创建test的视图映射
create view test(id varchar primary key,info1.name varchar, info2.address varchar);
注意Phoenix 创建的视图是只读的所以只能用来做查询无法通过视图对数据进行修改等操作
在表中插入两条数据
put test,10001,info1:name,why
put test,10001,info2:address,10086
在phoenix中查询
select * from test
注意这里的test一定要加双引号否则会将其识别为表而不是视图
查询结果如下 如何删除视图
drop view test;
视图的删除不会对hbase中的表造成任何影响在删除视图后依旧能在hbase中查询到表中的数据 表映射
create tabletest(id varchar primary key,info1.name varchar, info2.address varchar) column_encoded_bytes0; 进行表映射时不能使用列名编码需将 column_encoded_bytes 设为 0 在 Pheonix 创建表去映射 HBase 中已经存在的表是可以修改删除 HBase 中已经存在的数据的。而且删除 Phoenix 中的表那么 HBase 中被映射的表也会被删除
首先查询表中的数据 然后删除表映射
drop table test;
再去hbase中查询就会发现原表也被删除了 3.数字类型说明
HBase 中的数字底层存储为补码而 Phoenix 中的数字底层存储为在补码的基础上将符号位反转。故当在 Phoenix 中建表去映射 HBase 中已存在的表当 HBase 中有数字类型的字段时会出现解析错误的现象
测试
在hbase中创建表插入数据并扫描
create test_number,info
put test_number,1001,info:number,Bytes.toBytes(1000)
scan test_number,{COLUMNS info:number:toLong}
结果如下 toLong的作用是将bytes转化为long类型的数据
否则扫描出来的数据格式就是这样的 在phoenix中创建表映射
create view test_number(id varchar primary key,info.number bigint);
查询后发现结果有问题 解决方法
1.使用无符号类型
Phoenix 种提供了 unsigned_intunsigned_long 等无符号类型其对数字的编码解码方式和 HBase 是相同的如果无需考虑负数那在 Phoenix 中建表时采用无符号类型是最合适的选择
重新创建视图映射并查询
create view test_number(id varchar primary key,info.number unsigned_long);
select * from test_number;
结果如下 2.自定义函数 如需考虑负数的情况则可通过 Phoenix 自定义函数将数字类型的最高位即符号位反转即可
Phoenix JDBC 操作
添加依赖
dependencygroupIdorg.apache.phoenix/groupIdartifactIdphoenix-client-hbase-2.4/artifactIdversion5.1.2/version
/dependency
编写标准的jdbc代码
public static void main(String[] args) throws SQLException {//创建连接String url jdbc:phoenix:hadoop102,hadoop103,hadoop104:2181;//创建配置Properties properties new Properties();//获取连接Connection connection DriverManager.getConnection(url, properties);//编译sql语句PreparedStatement preparedStatement connection.prepareStatement(select * from student);//执行语句ResultSet resultSet preparedStatement.executeQuery();//输出结果while (resultSet.next()){System.out.println(resultSet.getString(1) : resultSet.getString(2) : resultSet.getString(3));}connection.close();//由于 Phoenix 框架内部需要获取一个 HBase 连接,所以会延迟关闭System.out.println(hello);
}
Phoenix 二级索引
添加如下配置到 HBase 的 HRegionserver 节点的 hbase-site.xml
!-- phoenix regionserver 配置参数--
propertynamehbase.regionserver.wal.codec/namevalueorg.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec/value
/property
全局索引global index
Global Index 是默认的索引格式创建全局索引时会在 HBase 中建立一张新表。也就是说索引数据和数据表是存放在不同的表中的因此全局索引适用于多读少写的业务场景
写数据的时候会消耗大量开销因为索引表也要更新而索引表是分布在不同的数据节点上的跨节点的数据传输带来了较大的性能消耗在读数据的时候 Phoenix 会选择索引表来降低查询消耗的时间 语法
创建索引CREATE INDEX my_index ON my_table (my_col);删除索引DROP INDEX my_index ON my_table
示例给age列添加索引
create index my_index on student(age);
查看二级索引是否有效
通过explain语法进行查看
explain select age from student where age 10; 添加二级索引之后会变成范围扫描
但如果查询的字段不是索引字段将会变成全局扫描
explain select id,name,addr from student where age 10; 包含索引covered index
创建携带其他字段的全局索引本质还是全局索引
语法CREATE INDEX my_index ON my_table (v1) INCLUDE (v2);
示例给age列添加索引并包含addr列
create index my_index on student(age) include (addr);
查看执行计划 本地索引local index
Local Index 适用于写操作频繁的场景。
索引数据和数据表的数据是存放在同一张表中且是同一个 Region避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销 语法CREATE LOCAL INDEX my_index ON my_table(my_column);
创建本地索引
CREATE LOCAL INDEX my_index ON student(age,addr);
查看执行计划
explain select id,name,addr from student where age 10;