HBase学习笔记(3)—— HBase整合Phoenix
目录
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 id='1001';
删除数据
delete from student where id='1001';
删除表
drop table student;
退出命令行
!quit
2.表的映射
默认情况下, HBase 中已存在的表,通过 Phoenix 是不可见的。如果要在 Phoenix 中操作 HBase 中已存在的表,可以在 Phoenix 中进行表的映射。映射方式有两种:视图映射和表映射
创建hbase表
在hbase shell中创建表test:create '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 table"test"(id varchar primary key,"info1"."name" varchar, "info2"."address" varchar) column_encoded_bytes=0;
进行表映射时,不能使用列名编码,需将 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_int,unsigned_long 等无符号类型,其对数字的编码解码方式和 HBase 是相同的,如果无需考虑负数,那在 Phoenix 中建表时采用无符号类型是最合适的选择
重新创建视图映射并查询:
create view "test_number"(id varchar primary key,"info"."number" unsigned_long);
select * from "test_number";
结果如下:

2.自定义函数:
如需考虑负数的情况,则可通过 Phoenix 自定义函数,将数字类型的最高位,即符号位反转即可
Phoenix JDBC 操作
添加依赖:
<dependency><groupId>org.apache.phoenix</groupId><artifactId>phoenix-client-hbase-2.4</artifactId><version>5.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 配置参数-->
<property><name>hbase.regionserver.wal.codec</name><value>org.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;

相关文章:
HBase学习笔记(3)—— HBase整合Phoenix
目录 Phoenix Shell 操作 Phoenix JDBC 操作 Phoenix 二级索引 HBase整合Phoenix Phoenix 简介 Phoenix 是 HBase 的开源 SQL 皮肤。可以使用标准 JDBC API 代替 HBase 客户端 API来创建表,插入数据和查询 HBase 数据 使用Phoenix的优点 在 Client 和 HBase …...
CentOS 7上生成HTTPS证书
在CentOS 7上生成HTTPS证书,可以使用OpenSSL工具。以下是在CentOS 7上生成自签名HTTPS证书的步骤: 安装OpenSSL: sudo yum install openssl生成证书和私钥: openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ssl.…...
解决React遍历每次渲染多个根元素导致无法为元素赋值key的问题
遍历时,存在多个根标签,如果使用<></>无法正确赋值key,代码如下: function App() {const list [{ id:1, name:"小明" },{ id:2, name:"小田" },{ id:3, name:"小王" }]const listCon…...
2023年软件安装管家目录最新
软件目录 ①【电脑办公】电脑系统(直接安装)Win7Win8Win10OfficeOffice激活office2003office2007office2010office2013office2016office2019office365office2021wps2021Projectproject2007project2010project2016project2019project2013project2021Visio…...
mac苹果笔记本应用程序在哪?有什么快捷方式吗?
苹果笔记本电脑一直以来都被广泛使用,而苹果的操作系统 macOS 也非常受欢迎。一台好的笔记本电脑不仅仅依赖于硬件配置,还需要丰富多样的应用程序来满足用户的需求。苹果笔记本应用程序在哪,不少mac新手用户会有这个疑问。在这篇文章中&#…...
py 循环打开多个页面
在Python中,你可以使用selenium库来循环打开多个页面并进行场控。Selenium是一个用于网页自动化测试的工具,它能够模拟用户与网页交互的操作,如点击、输入等。 以下是一个基本的示例代码,演示如何使用Selenium循环打开多个页面并…...
AD教程 (十八)导入常见报错解决办法(unkonw pin及绿色报错等)
AD教程 (十八)导入常见报错解决办法(unkonw pin及绿色报错等) 常见报错解决办法 绿色报错 可以先按TM,复位错位标识绿色报错原因一般是由于规则冲突的原因,和规则冲突就会报错 点击工具,设计…...
ubuntu22.04下hadoop3.3.6+hbase2.5.6+phoenix5.1.3开发环境搭建
一、涉及软件包资源清单 1、java 这里使用的是openjdk 2、hadoop-3.3.6.tar.gz 3、hbase-2.5.6-hadoop3-bin.tar.gz 4、phoenix-hbase-2.5-5.13-bin.tar.gz 5、apache-zookeeper-3.8.3-bin.tar.gz 6、openssl-3.0.12.tar.gz 二、安装 1、操作系统环境准备 换源 sudo vim /et…...
【随手记】python语言的else语句在for、while等循环语句中的运用
在Python中,else语句可以与if语句一起使用,用于处理条件不成立时的情况。但是,else语句也可以与循环结构(如for循环、while循环)一起使用,用于处理循环正常结束时的情况,即循环没有被break语句中…...
RK3568 + YT 9215交换机芯片,MAC TO MAC 调试记录
前言 原来的方案是rk3568 gmac 直接接phy,phy 接 switch 芯片,只是把交换芯片当交换用,驱动方面基本不用开发,但是要做vlan 那么必须涉及交换芯片的开发。 选择裕太微有两个方面的原因:1.国产化替代2.可获得原厂技术支持3.目前已经完成 两个gmac 口交换芯片的配置,实现v…...
Flutter笔记:桌面端应用多窗口管理方案
Flutter笔记 桌面端应用多窗口管理方案 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/134468587 【简介…...
demo(三)eurekaribbonhystrix----服务降级熔断
一、介绍: 1、雪崩: 多个微服务之间调用的时候,假如微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的"扇出"。如果扇出的链路上某个微服务的调用响应的时间过长或者不可用&am…...
相机突然断电,保存的DAT视频文件如何修复
3-7 本文主要解决因相机突然断电导致拍摄的视频文件损坏的问题。 在平常使用相机拍摄视频,比如用单反相机、无人机拍摄视频的时候,如果电池突然断电,或者突然炸机了,就非常有可能会得到一个损坏的视频文件,比如会产生…...
【数据结构与算法篇】顺序栈的C++实现
如何用C实现一个顺序栈 数据结构 -- 栈的简介顺序栈 - 结构体的定义顺序栈的初始化顺序栈的销毁入栈出栈获取栈顶元素判断顺序栈是否为空返回顺序栈中元素的个数 数据结构 – 栈的简介 栈是插入和删除遵循先进后出原则的一种容器。 也是一种线性表对象存放在栈, 可以…...
阿里云ESSD云盘、高效云盘和SSD云盘介绍和IOPS性能参数表
阿里云服务器系统盘或数据盘支持多种云盘类型,如高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘等,阿里云服务器网aliyunfuwuqi.com详细介绍不同云盘说明及单盘容量、最大/最小IOPS、最大/最小吞吐量、单路随机写平均时延…...
VSG-001
VulkanSceneGraph (VSG), is a modern, cross platform, high performance scene graph library built upon Vulkan VSG 是一个基于vulkan的现代的、跨平台的高性能场景管理库 VSg特性: 使用C17作为c规范编码,支持 CppCoreGuidelines支持 FOSS Best P…...
Smart Tomcat的使用
文章目录 Smart Tomcat的作用Smart Tomcat的安装Smart Tomcat的配置Smart Tomcat的启动 Smart Tomcat的作用 我们知道使用Servlet来完成一个项目一共需要七个步骤,即创建maven项目、添加依赖、创建目录结构、编写代码、打包程序、部署程序、验证程序。这样的确是完…...
vue3 TS数据处理常见错误分析:列表变为对象的错误如何处理
注意点1: return 语句无法跳出foreach()循环;return语句可以跳出For()循环。 注意点2:预防 [ ]变为object 后端前端之间传值如果为空的时候,数组会被变成空对象,如何解决呢? 描述:父传子 att…...
Hive效率优化记录
Hive是工作中常用的数据仓库工具,提供存储在HDFS文件系统,将结构化数据映射为一张张表以及提供查询和分析功能。 Hive可以存储大规模数据,但是在运行效率上不如传统数据库,这时需要懂得常见场景下提升存储或查询效率的方法&#x…...
⑩③【MySQL】详解SQL优化
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ SQL优化 ⑩③【MySQL】了解并掌握SQL优化1. 插…...
开源压枪系统:基于像素识别技术的后坐力补偿解决方案
开源压枪系统:基于像素识别技术的后坐力补偿解决方案 【免费下载链接】Apex-NoRecoil-2021 Scripts to reduce recoil for Apex Legends. (auto weapon detection, support multiple resolutions) 项目地址: https://gitcode.com/gh_mirrors/ap/Apex-NoRecoil-202…...
机械键盘连击修复:这款智能工具如何拯救你的打字体验
机械键盘连击修复:这款智能工具如何拯救你的打字体验 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 当你在编写重要文档时&…...
Java响应式编程实战:用Reactor 3.x处理高并发请求(附完整代码示例)
Java响应式编程实战:用Reactor 3.x处理高并发请求(附完整代码示例) 在当今高并发的互联网应用中,传统的同步阻塞式编程模型往往成为性能瓶颈。想象一下,当你的电商系统在秒杀活动中面临每秒数万次的请求时,…...
C#搞CV别再跪了!OpenCVSharp的SIFT/SURF实现:我熬3夜踩5个坑,吐血整理保姆级代码
🌪️ 一、先泼冰水:SIFT/SURF的“专利坟场”,别往里跳!(血泪预警) ⚠️ 重点敲黑板: SURF已凉透:OpenCV 4.5.0 彻底移除!别再搜“怎么用SURF”,纯属浪费生命&…...
Cursor Pro功能扩展工具:技术原理与开源解决方案
Cursor Pro功能扩展工具:技术原理与开源解决方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial re…...
别再踩坑了!Docker部署MinIO时,API和Console端口配置的保姆级避坑指南
Docker部署MinIO的端口配置避坑指南:从原理到实战 第一次用Docker部署MinIO时,我花了整整三个小时才搞明白为什么外网始终无法访问。控制台显示服务已启动,本地curl也能返回数据,但就是无法通过浏览器打开管理界面。直到查看日志才…...
快速上手ANIMATEDIFF PRO:从环境部署到视频导出的完整操作流程
快速上手ANIMATEDIFF PRO:从环境部署到视频导出的完整操作流程 1. 环境准备与快速部署 1.1 硬件要求检查 在开始之前,请确保您的设备满足以下最低配置要求: 显卡:NVIDIA RTX 3060及以上(推荐RTX 4090)显…...
AI背景分离革新性全攻略:ComfyUI-BiRefNet创意工作流零基础上手指南
AI背景分离革新性全攻略:ComfyUI-BiRefNet创意工作流零基础上手指南 【免费下载链接】ComfyUI-BiRefNet-ZHO Better version for BiRefNet in ComfyUI | Both img & video 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-BiRefNet-ZHO 在数字创意…...
智能写作工坊:OpenClaw+Qwen3.5-9B辅助小说创作
智能写作工坊:OpenClawQwen3.5-9B辅助小说创作 1. 为什么需要AI辅助写作? 作为一个业余小说创作者,我长期面临三个核心痛点:世界观设定碎片化、人物关系维护困难和情节发展缺乏新意。传统写作软件如Scrivener虽然提供了素材管理…...
nli-distilroberta-base完整指南:Web服务接口设计+返回格式解析
nli-distilroberta-base完整指南:Web服务接口设计返回格式解析 1. 项目概述 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务,专门用于分析两个句子之间的逻辑关系。这个轻量级但强大的模型能够快速判断句子对之间的三种…...
