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

news2024/11/24 3:26:07

目录

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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1209562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker-compose 部署 MySQL 8

前言 Windows 系统通过 docker-compose 部署 MySQL8.0。 MySQL 配置文件(my.cnf) # 服务端参数配置 [mysqld] usermysql # MySQL启动用户 default-storage-engineINNODB # 创建新表时将使用的默认存储引擎 character-set-serverutf8mb4 # 设置mysql服…

科研学习|科研软件——有序多分类Logistic回归的SPSS教程!

一、问题与数据 研究者想调查人们对“本国税收过高”的赞同程度&#xff1a;Strongly Disagree——非常不同意&#xff0c;用“0”表示&#xff1b;Disagree——不同意&#xff0c;用“1”表示&#xff1b;Agree--同意&#xff0c;用“2”表示&#xff1b;Strongly Agree--非常…

从0到0.01入门 Webpack| 002.精选 Webpack面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

基础课1——智能客服的定义

1.介绍 智能客服是一种采用人工智能技术的客户服务方式&#xff0c;它通过语音识别、自然语言处理、语义理解等技术&#xff0c;实现了与客户的自动交互。智能客服可以提供客户24小时不间断的服务&#xff0c;帮助客户快速解决问题&#xff0c;提高客户满意度。智能客服的应用…

oracle-buffer cache

段&#xff0c;区&#xff0c;块。 每当新建一个表&#xff0c;数据库会相应创建一个段。然后给这个段分配一个区。 一个区包含多个块。 区是oracle给段分配空间的最小单位。 块是oracle i\o的最小单位。 原则上&#xff0c;一个块包含多行数据。 dbf文件会被划分成一个一个…

学开发语言 求职互联网行业的未来发展

我喜欢回答各种各样的问题&#xff0c;自然也喜欢记录下自己的一些观点和看法。希望给朋友们多一点参考&#xff0c;也欢迎交流探讨。 提问&#xff1a; 自考本科&#xff0c;学的开发语言&#xff0c;问互联网行业求职和发展&#xff01; 作为一个资深码农&#xff0c;对这样…

分库分表之后,主键ID如何处理?

前言 当关系型数据库数据量过大时&#xff0c;通常会采用分库分表降低数据库查表压力。分库分表有多种&#xff0c;有分一个库多张分表额&#xff0c;有分多个库多张表的。一般分库分表使用ShardingSphere分表&#xff0c;建分片键等。但是分库分表之后&#xff0c;主键ID如何处…

快速掌握华为VRP系统的CLI管理技巧,让你轻松玩转命令行!

华为VRP基础 基本概述 VRP(通用路由平台) 系统软件&#xff1a;.cc 配置文件&#xff1a;.cfg,.zip,.dat 补丁文件&#xff1a;.pat paf文件&#xff1a;.bin 设备初始化&#xff1a; 设备管理方式&#xff1a; WEB网管&#xff1a;配置与设备同网段IP地址&#xff0c;使用浏览…

OpenGL_Learn11(光照)

目录 1. 光照 2. 环境光照 3. 漫反射光照 4. 代码实战 1. 光照 在OpenGL中主要分以下几个光照类型 环境光照(Ambient Lighting)&#xff1a;即使在黑暗的情况下&#xff0c;世界上通常也仍然有一些光亮&#xff08;月亮、远处的光&#xff09;&#xff0c;所以物体几乎永远不…

高德地图系列(一):vue项目如何使用高德地图、入门以及基本控件使用

目录 第一章 前言 第二章 准备工作 2.1 账号注册 2.2 高德地图开发平台文档 2.3 创建应用 第三章 使用地图 3.1 地图使用步骤 3.2 理解几个地图基础控件 3.3 基础类理解 第一章 前言 小编都是在vue项目中使用高德地图的&#xff0c;每一个功能都会亲测可用之后才会…

【2014年数据结构真题】

41. (13分&#xff09;二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。 给定一棵二叉树T,采用二叉链表存储&#xff0c;结点结构如下&#xff1a; 其中叶结点的weight域保存该结点的非负权值。 设root为指向T的根结点的指针&#xff0c; 请设计求T 的WPL…

linux下安装向日葵

https://sunlogin.oray.com/download/linux?typepersonal下载 在文件所在位置的空白处右键&#xff08;在此处打开终端&#xff09; 输入命令&#xff1a; sudo dpkg -i 文件名.deb &#xff08;文件名为下载的deb文件名字&#xff09;/usr/local/sunlogin/bin/sunlogincl…

JVM实战-JVM之类加载时机

目录 JVM实战-JVM之类加载时机1 主动引用2 被动引用 JVM实战-JVM之类加载时机 Java虚拟机把描述类的数据从Class文件加载到内存&#xff0c;并对数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的Java类型&#xff0c;这个过程被称作虚拟机的类加载机…

No208.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

arcgis--二维建筑面的三维显示设置

1、打开ArcScene软件&#xff0c;导入数据&#xff0c;如下&#xff1a; 2、 对建筑面进行拉伸。双击建筑物面图层&#xff0c;打开属性表&#xff0c;选择【拉伸】选项卡&#xff0c;参数设置如下&#xff1a; 显示结果如下&#xff1a;

第一篇 《随机点名答题系统》简介及设计流程图(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)

专栏目录 第一篇 《随机点名答题系统》简介及设计流程图&#xff08;类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统&#xff09;-CSDN博客 第二篇 《随机点名答题系统》——题库管理详解&#xff08;类抽奖系统、在线答题…

万宾科技内涝积水监测仪效果,预警城市积水

当城市之中出现强降雨或者大暴雨&#xff0c;可能会导致雨水不断堆积到城市排水管网之中&#xff0c;可能还会淹没城市的排水系统时&#xff0c;这种现象被称为城市之中的内涝&#xff0c;并且在许多城市之中内涝问题日益引起人们的关注。 内涝积水监测仪的出现成为了希望的灯塔…

java轮播图接口实现

一. 内容简介 实现java后端用户管理接口&#xff0c;数据库使用msyql。 二. 软件环境 2.1 java 1.8 2.2 mysql Ver 8.0.13 for Win64 on x86_64 (MySQL Community Server - GPL) 2.3 IDEA ULTIMATE 2019.3 2.4d代码地址 https://gitee.com/JJW_1601897441/competitionAs…

Unity中Shader的矩阵加减法

文章目录 前言一、什么是矩阵矩阵就是一组数的阵列 二、矩阵的加法三、矩阵的负值四、矩阵的减法五、矩阵的表示 前言 Unity中Shader用到的矩阵加减法&#xff0c;以及矩阵的一些基础常识 一、什么是矩阵 矩阵就是一组数的阵列 1 2 3 4 5 6 二、矩阵的加法 两个矩阵相加就是…

UE4 / UE5 内存与性能优化

性能优化 资源压缩粒子优化NavMeshGenerate Overlap EventGCMarkTime光照优化Shader优化卡的时间长LOD官方CPU、GPU Insights、stat cpu、 ue4 memory report、inter GPA 、RenderDOC、减少模型面数等 资源压缩 在图片资源上右键选择Size Map可以看到资源所占大小&#xff0c;…