hbase 集成 phoenix 实现 sql 化

1. 依赖

hbase => hbase 集群搭建

2. 下载安装包

点击下载

ps:该网页在内网可能打不开,遇到该情况有条件的可以打开 VPN 在下载

image-20240419144010832

3. 上传解压

使用工具将安装包上传的服务器上

笔者这里选择 上传到 /opt/software 目录,解压到 /opt/module 这两个目录可以随意选择

image-20240419144327703

tar -zxvf phoenix-hbase-2.4-5.1.3-bin.tar.gz -C /opt/module
cd /opt/module
mv phoenix-hbase-2.4-5.1.3-bin phoenix

image-20240419144737741

4. 安装服务器

phoenix 是依赖于 hbse 集群的,可以说只是 hbase 的皮肤

安装只需要将服务包放到 hbase 的 lib 依赖库里即可,注意一台集群都需要拷贝到位,可以先拷贝一台,借助分发脚本分发

cd /opt/module/phoenix
cp phoenix-server-hbase-2.4-5.1.3.jar /opt/module/hbase/lib/
xsync.sh /opt/module/hbase/lib

image-20240419144914014

PS:拷贝完成后一定要重启 hbase 集群

5. 客户端连接

# 第一次启动需要较长的时间,请耐心等待,这里的参数是 zookeepeer 集群连接 
cd /opt/module/phoenix
./bin/sqlline.py mitchell-101,mitchell-102,mitchell-103:2181

# 测试命令,查看所有表,如果安装成功,我们应该能看到很多系统表
!table

image-20240419150032766

6. JDBC 连接

6.1. 客户端依赖

下方的依赖包目前在公共的中央仓库是不存在的,只有一些低版本的依赖,我们无法使用

这里我们只能将安装包解压出来的客户端安装到我们的 maven 中,如果有仓库的可以上传仓库

笔者这边选择安装到本地仓库

1,将解压后目录中的 客户端 下载到本地(如下图)

image-20240422104547881

2,使用 maven 命令安装

mvn install:install-file -DgroupId=org.apache.phoenix -DartifactId=phoenix-client -Dversion=2.4-5.1.3 -Dpackaging=jar -D file=phoenix-client-hbase-2.4-5.1.3.jar

3,在项目中使用

<!-- phoenix 客户端依赖 -->
<dependency>
    <groupId>org.apache.phoenix</groupId>
    <artifactId>phoenix-client</artifactId>
    <version>2.4-5.1.3</version>
</dependency>

6.2. 简单示例

package com.mitchell.mus.tests.main;

import java.sql.*;
import java.util.Properties;

public class PhoneixTests {

    public static void main(String[] args) throws SQLException {
        
        // 声明地址和参数配置
        String jdbcUrl = "jdbc:phoenix:mitchell-101,mitchell-102,mitchell-103:2181";
        Properties properties = new Properties();

        // 获取连接
        Connection conn = DriverManager.getConnection(jdbcUrl, properties);

        // 获取操作对象
        Statement statement = conn.createStatement();

        // 执行语句并获取返回结果
        ResultSet resultSet = statement.executeQuery("select * from system.catalog");

        // 打印返回的结果
        while (resultSet.next()) {
            String tableName = resultSet.getString("TABLE_NAME");
            String columnName = resultSet.getString("COLUMN_NAME");

            System.out.println(tableName + "." + columnName);
        }

        // 关闭连接
        resultSet.close();
        statement.close();
        conn.close();
    }
    
}

7. 启用二级索引

7.1. 修改配置

cd /opt/module/hbase/conf/
vim hbase-site.xml

添加下方配置

<!-- 设置编解码器,通过在 WAL 日志中添加索引信息,是 phoenix 二级索引的前置配置 -->
<property>
    <name>hbase.regionserver.wal.codec</name>
    <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>	  

PS:记得分发到所有集群节点,然后重启集群

7.2. 全局索引

-- 创建表,必须要主键,支持联合主键
CREATE TABLE IF NOT EXISTS HB_USER (
    ID   INTEGER PRIMARY KEY,
    NAME VARCHAR,
    AGE  INTEGER
);

-- 新增/修改
UPSERT INTO HB_USER (ID, NAME, AGE) VALUES (1, '张三', 30);
UPSERT INTO HB_USER (ID, NAME, AGE) VALUES (2, '李四', 40);

-- 创建全局索引
CREATE INDEX IX_USER ON HB_USER(AGE);

-- 通过查看执行计划确定索引是否生效
EXPLAIN SELECT ID, AGE FROM HB_USER WHERE AGE = 30;
EXPLAIN SELECT ID, NAME, AGE FROM HB_USER WHERE AGE = 30;

全局索引会创建一张表,专门记录 索引字段 与 主键 的映射信息,查询的时候先查询索引表获取主键,在通过主键去取数据,从而提高查询效率,其比较适用于读多写少的应用场景。

但在查询时存在很大弊端:即想查询的字段如果不是索引字段的话,索引不会生效,比如例子中 id 主键,age 是索引,只查这两个字段索引可以生效,但是如果同时查询 name 的话索引就不生效了,如下图

image-20240419232047623

image-20240419232118372

7.3. 包含索引

为了解决全局索引的弊端,我们可以采取包含索引的方式,包含索引也是全局索引的一种,如果要使用全局索引建议使用包含索引

-- 删除索引
DROP INDEX IX_USER ON HB_USER;

-- 创建包含索引,本质上就是将想要和该索引字段一起查询的字段 INCLUDE 进去
CREATE INDEX IX_USER ON HB_USER(AGE) INCLUDE (NAME);

-- 查看执行计划
EXPLAIN SELECT ID, NAME, AGE FROM HB_USER WHERE AGE = 30;

image-20240419232645748

但是包含索引会让索引表的数据量变得很大

7.4. 本地索引(推荐)

本地索引不会创建表,数据都写在同一张表且是同一个 region 中,所以特别适合写操作频繁的表

-- 删除索引
DROP INDEX IX_USER ON HB_USER;

-- 创建本地索引
CREATE LOCAL INDEX IX_USER ON HB_USER(AGE);

-- 查看执行计划
EXPLAIN SELECT ID, NAME, AGE FROM HB_USER WHERE AGE = 30;

但是本地索引的查询性能要低于全局索引

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32和阿里云的智能台灯(STM32+ESP8266+MQTT+阿里云+语音模块)

一、主要完成功能 1、冷光模式和暖光模式两种灯光 主要支持冷光和暖光模式两种&#xff0c;可以通过语音模块或手机app远程切换冷暖光 2、自动模式和手动模式 主要支持手动模式和自动两种模式&#xff08;app或语音助手切换&#xff09; (1)自动模式&#xff1a;根据环境光照…

针孔相机模型原理坐标系辨析内参标定流程内参变换

针孔相机的内参标定 针孔相机原理真空相机模型图片的伸缩和裁剪变换 内参标定———非线性优化张正定标定详细原理(含公式推导)通过多张棋盘格照片完成相机的内参标定流程(C代码)其他工具箱 相机分为短焦镜头和长焦镜头&#xff0c;短焦镜头看到的视野更广阔&#xff0c;同样距…

QFD赋能人工智能:打造智能化需求分析与优化新纪元

在科技飞速发展的今天&#xff0c;人工智能(AI)已经渗透到我们生活的方方面面。然而&#xff0c;如何让AI更加贴合用户需求&#xff0c;提供更加精准和个性化的服务&#xff1f;这成为了一个亟待解决的问题。质量功能展开&#xff08;Quality Function Deployment&#xff0c;简…

openjudge_2.5基本算法之搜索_1998:寻找Nemo

题目 1998:寻找Nemo 总时间限制: 2000ms 内存限制: 65536kB 描述 Nemo 是个顽皮的小孩. 一天他一个人跑到深海里去玩. 可是他迷路了. 于是他向父亲 Marlin 发送了求救信号.通过查找地图 Marlin 发现那片海像一个有着墙和门的迷宫.所有的墙都是平行于 X 轴或 Y 轴的. 墙的厚度可…

股票战法课程之倍阴龙战法

1. 核心要素 1、股价处于低位震荡区间 2、涨停板分时走的比较流畅&#xff0c;即使去到分时均线以下也能够是秒拉上来&#xff0c;或者沿着分时均线上攻打板 3、涨停后次日阴线的成交量是前一日涨停板成交量的两倍以上 4、倍量阴线出现后的30天以内第一个涨停板则是买点的浮现…

【数据结构】图(Graph)

文章目录 概念图的存储方式邻接矩阵邻接矩阵表示法邻接矩阵表示法的特点 邻接表邻接表表示法邻接表表示法的特点邻接表表示法的定义与实现查找插入删除其它构造函数析构函数创建图输出图 图的遍历深度优先遍历&#xff08;DFS&#xff09;广度优先遍历 图的连接分量和生成树生成…

Hive查询操作详解

Hive 数据准备&#xff1a; Tips&#xff1a; &#xff08;1&#xff09;SQL 语言大小写不敏感。 &#xff08;2&#xff09;SQL 可以写在一行或者多行。 &#xff08;3&#xff09;关键字不能被缩写也不能分行。 &#xff08;4&#xff09;各子句一般要分行写。 &#xff0…

进程动静态库

文章目录 动态库和静态库1. 静态库2. 动态库 承接上文&#xff1a; 文件描述符 动态库和静态库 静态库与动态库&#xff1a; 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库&#xf…

python绘制R控制图(Range Chart)

R控制图&#xff08;Range Chart&#xff09;&#xff0c;也称为范围图或移动极差图&#xff0c;是一种用于分析和控制生产过程中的变异性的统计工具。它通常与Xbar控制图&#xff08;均值图&#xff09;一起使用&#xff0c;可以提供关于生产过程变异性的额外信息。以下是R控制…

ArgoCD集成部署到Kubernetes

1&#xff1a;环境 kubernetes1.23.3ArgoCD2.3.3 2&#xff1a;ArgoCD介绍 Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. Argo CD是一个基于Kubernetes的声明式的GitOps工具。 那么&#xff0c;什么是GitOps呢&#xff1f; GitOps是以Git为基…

feign整合sentinel做降级知识点

1&#xff0c;配置依赖 <!-- Feign远程调用依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> <!--sentinel--><dependency>…

Linux使用操作(一)

Linux创建链接的方式 在Linux中&#xff0c;可以给文件创建链接。链接的意思可以理解是快捷方式&#xff0c;它指向另一个文件或目录。 软链接 软连接&#xff08;也叫符号链接&#xff09;是一种特殊类型的文件&#xff0c;它指向另一个文件或目录 语法 ln -s 原文件路径…

谷歌发布基于声学建模的无限虚拟房间增强现实鲁棒语音识别技术

声学室模拟允许在AR眼镜上以最少的真实数据进行训练&#xff0c;用于开发鲁棒的语音识别声音分离模型。 随着增强现实&#xff08;AR&#xff09;技术的强大和广泛应用&#xff0c;它能应用到各种日常情境中。我们对AR技术的潜能感到兴奋&#xff0c;并持续不断地开发和测试新…

SpringBoot---------整合Mybatisplus

快速入门 第一步&#xff1a;导入依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency> 第二步&#xff1a;编写mapper…

区块链 | OpenSea 相关论文:Toward Achieving Anonymous NFT Trading(下)

&#x1f951;原文&#xff1a; Toward Achieving Anonymous NFT Trading VII 讨论&#xff1a;关于匿名性与市场平台的困境 在本文的这一部分&#xff0c;我们将讨论关于隐藏 NFT 所有者地址的困境&#xff0c;以及为什么像 OpenSea 这样的 NFT 市场平台几乎必须得到完全的信…

Java | 选择排序算法实现

大家可以关注一下专栏&#xff0c;方便大家需要的时候直接查找&#xff0c;专栏将持续更新~ 题目描述 编写一个Java程序&#xff0c;实现选择排序算法。程序需要能够接收一个整型数组作为输入&#xff0c;并输出排序后的数组。 选择排序是一种简单直观的排序算法&#xf…

imx6ull -- SPI

SPI 是 Motorola 公司推出的一种同步串行接口 技术&#xff0c;是一种高速、全双工的同步通信总线&#xff0c; SPI 时钟频率相比 I2C 要高很多&#xff0c;最高可以工作 在上百 MHz。 SPI 以主从方式工作&#xff0c;通常是有一个主设备和一个或多个从设备&#xff0c;一般 SP…

ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件

前言&#xff1a; 从开始学习Vue到使用element-ui-admin已经有将近快两年的时间了&#xff0c;在之前的开发中使用element-ui上传组件el-upload都是直接使用文件选取后立即选择上传&#xff0c;今天刚好做了一个和之前类似的文件选择上传的需求&#xff0c;不过这次是需要手动点…

[InternLM训练营第二期笔记]5. LMDeploy 量化部署 LLM 实践

该系列是上海AI Lab举行的书生 浦语大模型训练营的相关笔记部分。 该笔记是第五节课&#xff0c;学习大语言模型量化的基本概念&#xff0c;以及利用LMDeploy工具进行微调。 0. 模型部署的概念 0.0 背景 如果要将大模型在特定平台&#xff08;大到服务器集群&#xff0c;小到…

需求 分析

需求分析的任务 需求分析的任务 1、需求分析是软件定义时期的最后一个阶段&#xff0c;它的基本任务是准确地回答“系统必须做什么?”这个问题。 2、确定系统必须完成哪些工作&#xff0c;也就是对目标系统提出完整、准确、清晰、具体的要求。 3、系统分析员应该写出软件需求…
最新文章