第 6 章 整合 Phoenix

news2024/11/19 23:31:13

6.1 Phoenix 简介

6.1.1 Phoenix 定义

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

6.1.2 为什么使用 Phoenix

官方给的解释为:在 Client 和 HBase 之间放一个 Phoenix 中间层不会减慢速度,因为用
户编写的数据处理代码和 Phoenix 编写的没有区别(更不用说你写的垃圾的多),不仅如此
Phoenix 对于用户输入的 SQL 同样会有大量的优化手段(就像 hive 自带 sql 优化器一样)。

Phoenix 在 5.0 版本默认提供有两种客户端使用(瘦客户端和胖客户端),在 5.1.2 版本
安装包中删除了瘦客户端,本文也不再使用瘦客户端。而胖客户端和用户自己写 HBase 的
API 代码读取数据之后进行数据处理是完全一样的。

6.2 Phoenix 快速入门

6.2.1 安装

1)官网地址

http://phoenix.apache.org/

2)Phoenix 部署

  • (1)上传并解压 tar 包
[atguigu@hadoop102 software]$ tar -zxvf phoenix-hbase-2.4-5.1.2-bin.tar.gz -C /opt/module/

[atguigu@hadoop102 module]$ mv phoenix-hbase-2.4-5.1.2-bin /phoenix
  • (2)复制 server 包并拷贝到各个节点的 hbase/lib
[atguigu@hadoop102 module]$ cd /opt/module/phoenix/

[atguigu@hadoop102 phoenix]$ cp phoenix-server-hbase-2.4-5.1.2.jar /opt/module/hbase/lib/

[atguigu@hadoop102 phoenix]$ xsync /opt/module/hbase/lib/ phoenix-server-hbase-2.4-5.1.2.jar
  • (3)配置环境变量
#phoenix
export PHOENIX_HOME=/opt/module/phoenix
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PATH:$PHOENIX_HOME/bin
  • (4)重启 HBase
[atguigu@hadoop102 ~]$ stop-hbase.sh
[atguigu@hadoop102 ~]$ start-hbase.sh
  • (5)连接 Phoenix
[atguigu@hadoop101 phoenix]$ /opt/module/phoenix/bin/sqlline.py hadoop102,hadoop103,hadoop104:2181
  • (6)错误解决
    出现下面错误的原因是之前使用过 phoenix,建议删除之前的记录
警告: Failed to load history
java.lang.IllegalArgumentException: Bad history file syntax! The 
history file `/home/atguigu/.sqlline/history` may be an older 
history: please remove it or use a different history file.

解决方法:在/home/atguigu 目录下删除.sqlline 文件夹

[atguigu@hadoop102 ~]$ rm -rf .sqlline/

6.2.2 Phoenix Shell 操作

6.2.2.1 table

关于 Phoenix 的语法建议使用时直接查看官网:
https://phoenix.apache.org/language/index.html

1)显示所有表

!table 或 !tables

2)创建表
直接指定单个列作为 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 中的列名做编码处理。具体规则可参考官网链接:
https://phoenix.apache.org/columnencoding.html,
若不想对列名编码,可在建表语句末尾加上 COLUMN_ENCODED_BYTES = 0;

3)插入数据

upsert into student values('1001','zhangsan', 10, 'beijing');

4)查询记录

select * from student;
select * from student where id='1001';

5)删除记录

delete from student where id='1001';

6)删除表

drop table student;

7)退出命令行

!quit

6.2.2.2 表的映射

1)表的关系
默认情况下, HBase 中已存在的表,通过 Phoenix 是不可见的。如果要在 Phoenix 中操作 HBase 中已存在的表,可以在 Phoenix 中进行表的映射。

映射方式有两种:视图映射表映射

2)命令行中创建表 test
HBase 中 test 的表结构如下,两个列族 info1、info2。
在这里插入图片描述
(1)启动 HBase Shell

[atguigu@hadoop102 ~]$ /opt/module/hbase/bin/hbase shell

(2)创建 HBase 表 test

hbase(main):001:0> create 'test','info1','info2'

3)视图映射
Phoenix 创建的视图是只读的,所以只能用来做查询,无法通过视图对数据进行修改等操作。
在 phoenix 中创建关联 test 表的视图。

0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> 
	create view 
	"test"(id varchar primary key,"info1"."name" varchar, 
	"info2"."address" varchar);

删除视图

0: jdbc:phoenix:hadoop101,hadoop102,hadoop103>	 drop view "test";

4)表映射
在 Pheonix 创建表去映射 HBase 中已经存在的表,是可以修改删除 HBase 中已经存在的数据的。

而且,删除 Phoenix 中的表,那么 HBase 中被映射的表也会被删除。

注:进行表映射时,不能使用列名编码,
需将 column_encoded_bytes 设为 0。

0: jdbc:phoenix:hadoop101,hadoop102,hadoop103> 
	create table
	"test"(id varchar primary key,"info1"."name" varchar, 
	"info2"."address" varchar)
	 column_encoded_bytes=0;

6.2.2.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'}

phoenix 演示:

create view "test_number"(id varchar primary key,"info"."number" bigint);

select * from "test_number";

即Hbase直接创建数值类型时,比较麻烦,需要经过Bytes方法的转换。

解决上述问题的方案有以下两种:
(1)Phoenix 种提供了 unsigned_int,unsigned_long 等无符号类型,其对数字的编码解
码方式和 HBase 是相同的,如果无需考虑负数,那在 Phoenix 中建表时采用无符号类型是最
合适的选择。
phoenix 演示:

drop view "test_number";

create view "test_number"(id varchar primary key,"info"."number" unsigned_long);
select * from "test_number";

(2)如需考虑负数的情况,则可通过 Phoenix 自定义函数,将数字类型的最高位,即
符号位反转即可,自定义函数可参考如下链接:https://phoenix.apache.org/udf.html。

6.2.3 Phoenix JDBC 操作

此处演示一个标准的 JDBC 连接操作,实际开发中会直接使用别的框架内嵌的 Phoenix 连接。

1)胖客户端

  • (1)maven 依赖
<dependencies>
	 <dependency>
	 <groupId>org.apache.phoenix</groupId>
	 <artifactId>phoenix-client-hbase-2.4</artifactId>
	 <version>5.1.2</version>
	 </dependency>
</dependencies>

(2)编写代码

package com.atguigu.phoenix;
import java.sql.*;
import java.util.Properties;

public class PhoenixClient {
		 public static void main(String[] args) throws SQLException {
		 // 标准的 JDBC 代码
		 // 1.添加链接
		 String url = "jdbc:phoenix:hadoop102,hadoop103,hadoop104:2181";
		 // 2. 创建配置
		 // 没有需要添加的必要配置 因为 Phoenix 没有账号密码
		 Properties properties = new Properties();
		 // 3. 获取连接
		 Connection connection = DriverManager.getConnection(url, 
		properties);
		 // 5.编译 SQL 语句
		 PreparedStatement preparedStatement = 
		connection.prepareStatement("select * from student");
		 // 6.执行语句
		 ResultSet resultSet = preparedStatement.executeQuery();
		 // 7.输出结果
		 while (resultSet.next()){
		 System.out.println(resultSet.getString(1) + ":" + 
		resultSet.getString(2) + ":" + resultSet.getString(3));
		 }
		 // 8.关闭资源
		 connection.close();
		 // 由于 Phoenix 框架内部需要获取一个 HBase 连接,所以会延迟关闭
		 // 不影响后续的代码执行
		 System.out.println("hello");
 }
}

6.3 Phoenix 二级索引

6.3.1 二级索引配置文件

添加如下配置到 HBase 的 HRegionserver 节点的 hbase-site.xml。

<!-- phoenix regionserver 配置参数-->
<property>
	 <name>hbase.regionserver.wal.codec</name>
	<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>

6.3.2 全局索引(global index)

Global Index 是默认的索引格式,创建全局索引时,会在 HBase 中建立一张新表。也就是说索引数据和数据表是存放在不同的表中的,因此全局索引适用于多读少写的业务场景。

写数据的时候会消耗大量开销,因为索引表也要更新,而索引表是分布在不同的数据节点上的,跨节点的数据传输带来了较大的性能消耗。

在读数据的时候 Phoenix 会选择索引表来降低查询消耗的时间。

创建单个字段的全局索引。

CREATE INDEX my_index ON my_table (my_col);

#例如
0: jdbc:phoenix:hadoop102,hadoop103,hadoop104>
create index
my_index on student1(age);


#删除索引
DROP INDEX my_index ON my_table

0: jdbc:phoenix:hadoop102,hadoop103,hadoop104>

drop index my_index
on student1;

查看二级索引是否有效,可以使用 explainPlan 执行计划,有二级索引之后会变成范围扫描

0: jdbc:phoenix:hadoop102,hadoop103,hadoop104> 

explain select 
id,name from student1 where age = 10;

+----------------------------------------------------------------
---------+----------------+---------------+---------+
| PLAN | 
EST_BYTES_READ | EST_ROWS_READ | EST_INF |
+----------------------------------------------------------------
---------+----------------+---------------+---------+
| CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN RANGE SCAN OVER MY_INDEX 
[10] | null | null | null |
| SERVER FILTER BY FIRST KEY ONLY 
| null | null | null |
+----------------------------------------------------------------
---------+----------------+---------------+---------+
2 rows selected (0.044 seconds)

如果想查询的字段不是索引字段的话索引表不会被使用,也就是说不会带来查询速度的提升。

0: jdbc:phoenix:hadoop102,hadoop103,hadoop104> 

explain select 
id,name,addr from student1 where age = 10;

+----------------------------------------------------------------
---+----------------+---------------+-------------+
| PLAN | 
EST_BYTES_READ | EST_ROWS_READ | EST_INFO_TS |
+----------------------------------------------------------------
---+----------------+---------------+-------------+
| CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN FULL SCAN OVER STUDENT1 
| null | null | null |
| SERVER FILTER BY AGE = 10 | 
null | null | null |
+----------------------------------------------------------------
---+----------------+---------------+-------------+
2 rows selected (0.024 seconds)

若想解决上述问题,可采用如下方案:
(1)使用包含索引
(2)使用本地索引

6.3.3 包含索引(covered index)

创建携带其他字段的全局索引(本质还是全局索引)。

CREATE INDEX my_index ON my_table (v1) INCLUDE (v2);

先删除之前的索引:

0: jdbc:phoenix:hadoop102,hadoop103,hadoop104> 

drop index my_index 
on student1;

#创建包含索引
0: jdbc:phoenix:hadoop102,hadoop103,hadoop104>

create index 
my_index on student1(age) include (addr);

之后使用执行计划查看效果

0: jdbc:phoenix:hadoop102,hadoop103,hadoop104> 
explain select id,name,addr from student1 where age = 10;

+----------------------------------------------------------------
---------+----------------+---------------+---------+
| PLAN | 
EST_BYTES_READ | EST_ROWS_READ | EST_INF |
+----------------------------------------------------------------
---------+----------------+---------------+---------+
| CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN RANGE SCAN OVER MY_INDEX 
[10] | null | null | null |
+----------------------------------------------------------------
---------+----------------+---------------+---------+
1 row selected (0.112 seconds)

6.3.4 本地索引(local index)

Local Index 适用于写操作频繁的场景。

索引数据和数据表的数据是存放在同一张表中(且是同一个 Region),避免了在写操作
的时候往不同服务器的索引表中写索引带来的额外开销。

my_column 可以是多个。

CREATE LOCAL INDEX my_index ON my_table (my_column);
本地索引会将所有的信息存在一个影子列族中,虽然读取的时候也是范围扫描,
但是没有全局索引快,优点在于不用写多个表了。
#删除之前的索引
0: jdbc:phoenix:hadoop102,hadoop103,hadoop104> 
drop index my_index on student1;


#创建本地索引
0: jdbc:phoenix:hadoop102,hadoop103,hadoop104> 
CREATE LOCAL INDEX my_index ON student1 (age,addr);


#使用执行计划
0: jdbc:phoenix:hadoop102,hadoop103,hadoop104> 
explain select id,name,addr from student1 where age = 10;
+----------------------------------------------------------------
-----------+----------------+---------------+-------+
| PLAN | 
EST_BYTES_READ | EST_ROWS_READ | EST_I |
+----------------------------------------------------------------
-----------+----------------+---------------+-------+
| CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN RANGE SCAN OVER STUDENT1 
[2,10] | null | null | null |
| SERVER MERGE [0.ADDR] 
| null | null | null |
| SERVER FILTER BY FIRST KEY ONLY 
| null | null | null |
+----------------------------------------------------------------
-----------+----------------+---------------+-------+
3 rows selected (0.025 seconds)

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

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

相关文章

WatchGuard 防火墙策略、配置和日志分析器

获取 Internet 活动见解并及时了解安全事件是一项具有挑战性的任务&#xff0c;因为安全设备会生成大量的安全和流量日志。Firewall Analyzer 针对 WatchGuard 防火墙设备的报告功能具有一系列功能&#xff0c;使您能够增强网络安全。WatchGuard 日志分析器软件&#xff0c;可让…

【推荐】网络安全10本入门必看书籍

前言 对于初学者来说&#xff0c;了解网络安全的入门知识是非常重要的。以下是我推荐的10本入门网络安全必看的书籍 1.《黑客攻防技术宝典》 作者&#xff1a;余洪涛&#xff0c;出版社&#xff1a;清华大学出版社 这本书是网络安全初学者入门的好选择。书中讲解了黑客攻击和…

尚硅谷大数据技术Spark教程-笔记06【SparkCore(案例实操,电商网站)】

视频地址&#xff1a;尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01【SparkCore&#xff08;概述、快速上手、运行环境、运行架构&#xff09;】尚硅谷大数据技术Spark教程-笔记02【SparkCore&#xff08;核心编程&#xff0c;RDD-核…

速看,关于Python的17个学习网站,从基础到机器学习【建议收藏】

目录 一、基础学习网站Python官方教程Python官方安装包地址PyCharm下载地址anaconda3清华开源下载地址 二、爬虫学习网站requests官方学习网站BeautifulSoup文档网站selenium官方学习网站scrapy中文学习网站 三、数据分析学习网站numpy官方文档网站pandas官方文档网站sklearn官…

Spring-Rest- url 请求风格和SpringMVC 映射请求数据

目录 Rest- url 请求风格 Rest-基本介绍 ● 说明 实例 说明&#xff1a; ● REST 的核心过滤器 代码说明Rest 风格的 url-完成增删改 需求说明 ​编辑修改 web.xml 添加 HiddenHttpMethodFilter 修改 springDispatcherServlet-servlet.xml 作用 创建rest.jsp 解读…

大数据技术之Kettle

目录 第1章 Kettle概述 1.1 ETL简介 1.2 Kettle简介1.2.1 Kettle是什么 1.2.2 Kettle的两种设计 1.2.3 Kettle的核心组件 1.2.4 Kettle特点 第2章 Kettle安装部署 2.1 Kettle下载 2.1.1 下载地址 2.1.2 Kettle目录说明 2.1.3 Kettle文件说明 2.2 Kettle安装部署 2…

openai账号创建教程-openai注册问题大全

openai注册页面打不开 遇到openai注册页面打不开&#xff0c;可以用以下解决方法&#xff1a; 检查网络连接。如果您的网络连接不稳定或者有问题&#xff0c;可能会导致访问网站异常。请尝试使用其他设备或连接其他网络&#xff0c;看是否能够打开OpenAI注册页面。 清除浏览器…

为什么需要使用Docker

简介与概述 1.介绍 Docker是一个开源的应用容器引擎&#xff0c;基于Go语言开发的&#xff0c;并且遵从Apache2.0协议开源。 Docker可以让开发者打包他们的应用以及依赖&#xff0c;打包到轻量级、可移植的容器中&#xff0c;然后发布到任何一个流行的Linux服务器上&#xff…

新库上线 | CnOpenData中国标准数据

中国标准数据 一、数据简介 按照《中华人民共和国标准化法》的定义&#xff0c;标准是指农业、工业、服务业以及社会事业等领域需要统一的技术要求。标准作为一种通用性的规范语言&#xff0c;在合理利用国家资源、保障产品质量、提高市场信任度、促进商品流通、维护公平竞争、…

使用JPA自动生成代码(轻松上手看了就会版)

目录 背景&#xff1a;方案概念&#xff1a;JPA 的主要作用 jpa简单使用&#xff08;Springboot项目&#xff09;jpa进阶使用总结 背景&#xff1a; 项目需要自动生成sql代码&#xff0c;不需要写sql语句&#xff0c;能够自动进行查询&#xff0c;我想到了JPA。 方案 概念&a…

Jetpack Compose 不止是一个UI框架~

Jetpack Compose是用于构建原生Android UI的现代工具包。 Jetpack Compose使用更少的代码&#xff0c;强大的工具和直观的Kotlin API&#xff0c;简化并加速了Android上的UI开发。这是Android Developers 官网对它的描述。 本文不是教你Jetpack Compose 的一些基本使用方法&am…

【通过xib自定义Cell Objective-C语言】

一、我们怎么样来自定义单元格呢, 1.我们先来分析一下, 我们这里虽然有很多行,但是每一行,长的都是一样的, 这里有一个Label、那里有一个Label, 每一行每一行,长的都是一样的,唯独只有数据不一样吧, 所以说,遇到这种情况,我们就可以考虑用一个xib,描述一个单元…

倒计时24天!接棒香港展,CTIS2023观众预登记全面启动

4月22日,环球资源春季香港展在亚洲国际展览馆落下帷幕。两期展会,十馆全开,共历时8天。汇聚来自中国大陆、香港、台湾地区、韩国、越南、印度等地逾4,000家优质供应商超过30万件产品。吸引近10万人次的专业观众参观。环球资源为买卖双方打造优质贸易平台,让买家第一时间把握消费…

【Python零基础学习入门篇⑤】——第五节:Python中的函数

⬇️⬇️⬇️⬇️⬇️⬇️ ⭐⭐⭐Hello&#xff0c;大家好呀我是陈童学哦&#xff0c;一个普通大一在校生&#xff0c;请大家多多关照呀嘿嘿&#x1f601;&#x1f60a;&#x1f618; &#x1f31f;&#x1f31f;&#x1f31f;技术这条路固然很艰辛&#xff0c;但既已选择&…

【RDC2022纪念板】RT-Smart D1s上手

目录 环境准备开发板硬件介绍开发环境搭建烧录 环境准备 windows电脑&#xff08;用于烧录固件和串口日志查看&#xff09;Ubuntu虚拟机&#xff08;用于编译生成固件&#xff09;RDC2022纪念板TypeC数据线 开发板硬件介绍 开发板使用了全志科技的D1s芯片&#xff0c;全志RIS…

PAVC100R4222 PARKER轴向柱塞泵

PAVC100R4222 PARKER轴向柱塞泵特点&#xff1a; 1、壳体为高强度铸铁 2、两段设计便于维护 3、全密封的轴用轴承 4、内置增压器***高转速性能&#xff0c;可达3000 RPM( PAVC100为2600 RPM) 5、控制器为插装形式&#xff0c;易于现场更换 6、配流盘为可替换的青铜复合 10、过滤…

R实践——paleobioDB详解(paleobiology database)

paleobioDB详解&#xff08;paleobiology database&#xff09; PBDB初步认识paleobioDB一个简单的例子 所有函数详解1. pbdb_collection描述用法参数细节值例子 2. pbdb_collections描述用法参数值例子 3. pbdb_collections_geo描述用法参数值例子 4. pbdb_interval描述用法参…

成为数据分析师,需要具备哪些技能?

随着互联网的发展&#xff0c;数据分析师的特点越来越明显&#xff0c;对数据分析师综合素质的要求也较高。 1、较强的数据挖掘、信息整理、和逻辑分析能力 数据分析&#xff0c;也是数据分析师的一个方向。 制作日常性的经营报表&#xff0c;对公司或者行业KPI指标进行拆解…

【Linux超强学习路线图】赶紧收藏学习!

​很多朋友在学习Linux时&#xff0c;不知道学什么&#xff0c;不知道怎么学&#xff0c;有的朋友甚至把所有知识点都当成重点学起&#xff0c;但其实这样不仅浪费时间更浪费精力。今天就给大家安排一份「Linux超强学习路线图」&#xff01; 这张Linux超强学习路线图&#xff…

ThingsBoard使用jar包单机部署的问题以及如何解决问题

1、概述 这一节我将给大家讲述一下前面章节的问题,因为我直接都是跳过问题直接给大家演示正确的步骤,相当于我帮大家把坑踩完了,我主要讲两个问题,尤其是第一个问题,很多人都遇到过。 2、问题1 为什么要在thingsboard.yml中配置install.data_dir? 如果不配置这个inst…