当前位置: 首页 > news >正文

HBase学习笔记(3)—— HBase整合Phoenix

目录

Phoenix Shell 操作

Phoenix JDBC 操作

Phoenix 二级索引

HBase整合Phoenix

Phoenix 简介

Phoenix 是 HBase 的开源 SQL 皮肤。可以使用标准 JDBC API 代替 HBase 客户端 API来创建表,插入数据和查询 HBase 数据

使用Phoenix的优点

  1. 在 Client 和 HBase 之间放一个 Phoenix 中间层不会减慢速度
  2. 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来创建表&#xff0c;插入数据和查询 HBase 数据 使用Phoenix的优点 在 Client 和 HBase …...

CentOS 7上生成HTTPS证书

在CentOS 7上生成HTTPS证书&#xff0c;可以使用OpenSSL工具。以下是在CentOS 7上生成自签名HTTPS证书的步骤&#xff1a; 安装OpenSSL&#xff1a; sudo yum install openssl生成证书和私钥&#xff1a; openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ssl.…...

解决React遍历每次渲染多个根元素导致无法为元素赋值key的问题

遍历时&#xff0c;存在多个根标签&#xff0c;如果使用<></>无法正确赋值key&#xff0c;代码如下&#xff1a; function App() {const list [{ id:1, name:"小明" },{ id:2, name:"小田" },{ id:3, name:"小王" }]const listCon…...

2023年软件安装管家目录最新

软件目录 ①【电脑办公】电脑系统&#xff08;直接安装&#xff09;Win7Win8Win10OfficeOffice激活office2003office2007office2010office2013office2016office2019office365office2021wps2021Projectproject2007project2010project2016project2019project2013project2021Visio…...

mac苹果笔记本应用程序在哪?有什么快捷方式吗?

苹果笔记本电脑一直以来都被广泛使用&#xff0c;而苹果的操作系统 macOS 也非常受欢迎。一台好的笔记本电脑不仅仅依赖于硬件配置&#xff0c;还需要丰富多样的应用程序来满足用户的需求。苹果笔记本应用程序在哪&#xff0c;不少mac新手用户会有这个疑问。在这篇文章中&#…...

py 循环打开多个页面

在Python中&#xff0c;你可以使用selenium库来循环打开多个页面并进行场控。Selenium是一个用于网页自动化测试的工具&#xff0c;它能够模拟用户与网页交互的操作&#xff0c;如点击、输入等。 以下是一个基本的示例代码&#xff0c;演示如何使用Selenium循环打开多个页面并…...

AD教程 (十八)导入常见报错解决办法(unkonw pin及绿色报错等)

AD教程 &#xff08;十八&#xff09;导入常见报错解决办法&#xff08;unkonw pin及绿色报错等&#xff09; 常见报错解决办法 绿色报错 可以先按TM&#xff0c;复位错位标识绿色报错原因一般是由于规则冲突的原因&#xff0c;和规则冲突就会报错 点击工具&#xff0c;设计…...

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中&#xff0c;else语句可以与if语句一起使用&#xff0c;用于处理条件不成立时的情况。但是&#xff0c;else语句也可以与循环结构&#xff08;如for循环、while循环&#xff09;一起使用&#xff0c;用于处理循环正常结束时的情况&#xff0c;即循环没有被break语句中…...

RK3568 + YT 9215交换机芯片,MAC TO MAC 调试记录

前言 原来的方案是rk3568 gmac 直接接phy,phy 接 switch 芯片,只是把交换芯片当交换用,驱动方面基本不用开发,但是要做vlan 那么必须涉及交换芯片的开发。 选择裕太微有两个方面的原因:1.国产化替代2.可获得原厂技术支持3.目前已经完成 两个gmac 口交换芯片的配置,实现v…...

Flutter笔记:桌面端应用多窗口管理方案

Flutter笔记 桌面端应用多窗口管理方案 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134468587 【简介…...

demo(三)eurekaribbonhystrix----服务降级熔断

一、介绍&#xff1a; 1、雪崩&#xff1a; 多个微服务之间调用的时候&#xff0c;假如微服务A调用微服务B和微服务C&#xff0c;微服务B和微服务C又调用其他的微服务&#xff0c;这就是所谓的"扇出"。如果扇出的链路上某个微服务的调用响应的时间过长或者不可用&am…...

相机突然断电,保存的DAT视频文件如何修复

3-7 本文主要解决因相机突然断电导致拍摄的视频文件损坏的问题。 在平常使用相机拍摄视频&#xff0c;比如用单反相机、无人机拍摄视频的时候&#xff0c;如果电池突然断电&#xff0c;或者突然炸机了&#xff0c;就非常有可能会得到一个损坏的视频文件&#xff0c;比如会产生…...

【数据结构与算法篇】顺序栈的C++实现

如何用C实现一个顺序栈 数据结构 -- 栈的简介顺序栈 - 结构体的定义顺序栈的初始化顺序栈的销毁入栈出栈获取栈顶元素判断顺序栈是否为空返回顺序栈中元素的个数 数据结构 – 栈的简介 栈是插入和删除遵循先进后出原则的一种容器。 也是一种线性表对象存放在栈&#xff0c; 可以…...

阿里云ESSD云盘、高效云盘和SSD云盘介绍和IOPS性能参数表

阿里云服务器系统盘或数据盘支持多种云盘类型&#xff0c;如高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘等&#xff0c;阿里云服务器网aliyunfuwuqi.com详细介绍不同云盘说明及单盘容量、最大/最小IOPS、最大/最小吞吐量、单路随机写平均时延…...

VSG-001

VulkanSceneGraph (VSG), is a modern, cross platform, high performance scene graph library built upon Vulkan VSG 是一个基于vulkan的现代的、跨平台的高性能场景管理库 VSg特性&#xff1a; 使用C17作为c规范编码&#xff0c;支持 CppCoreGuidelines支持 FOSS Best P…...

Smart Tomcat的使用

文章目录 Smart Tomcat的作用Smart Tomcat的安装Smart Tomcat的配置Smart Tomcat的启动 Smart Tomcat的作用 我们知道使用Servlet来完成一个项目一共需要七个步骤&#xff0c;即创建maven项目、添加依赖、创建目录结构、编写代码、打包程序、部署程序、验证程序。这样的确是完…...

vue3 TS数据处理常见错误分析:列表变为对象的错误如何处理

注意点1&#xff1a; return 语句无法跳出foreach()循环&#xff1b;return语句可以跳出For()循环。 注意点2&#xff1a;预防 [ ]变为object 后端前端之间传值如果为空的时候&#xff0c;数组会被变成空对象&#xff0c;如何解决呢&#xff1f; 描述&#xff1a;父传子 att…...

Hive效率优化记录

Hive是工作中常用的数据仓库工具&#xff0c;提供存储在HDFS文件系统&#xff0c;将结构化数据映射为一张张表以及提供查询和分析功能。 Hive可以存储大规模数据&#xff0c;但是在运行效率上不如传统数据库&#xff0c;这时需要懂得常见场景下提升存储或查询效率的方法&#x…...

⑩③【MySQL】详解SQL优化

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ SQL优化 ⑩③【MySQL】了解并掌握SQL优化1. 插…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...