HBase整合Phoenix

文章目录

    • 一、简介
      • 1、Phoenix定义
      • 2、Phoenix架构
    • 二、安装Phoenix
      • 1、安装
    • 三、Phoenix操作
      • 1、Phoenix 数据映射
      • 2、Phoenix Shell操作
      • 3、Phoenix JDBC操作
        • 3.1 胖客户端
        • 3.2 瘦客户端
    • 四、Phoenix二级索引
      • 1、为什么需要二级索引
      • 2、全局索引(global index)
      • 3、包含索引(covered index)
      • 4、本地索引(local index)


一、简介

1、Phoenix定义

1)官网地址:http://phoenix.apache.org/

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

优点:使用简单,直接能写sql。

缺点:效率没有自己设计rowKey再使用API高,性能较差。

2、Phoenix架构

在这里插入图片描述

二、安装Phoenix

1、安装

将安装包上传到服务器目录

解压安装包

tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz -C /opt/module/
mv /opt/module/apache-phoenix-5.0.0-HBase-2.0-bin /opt/module/phoenix

复制server包并拷贝到各个节点Hadoop101、Hadoop102、Hadoop103hbase/lib

cp /opt/module/phoenix/phoenix-5.0.0-HBase-2.0-server.jar /opt/module/hbase/lib/
xsync /opt/module/hbase/lib/phoenix-5.0.0-HBase-2.0-server.jar

配置环境变量

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

在hbase-site.xml中添加支持二级索引的参数(如果不需要创建二级索引,不用不加)。之后分发到所有regionserver的节点上。

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

配置内容

<property>
    <name>hbase.regionserver.wal.codec</name>
    <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>

<property>
    <name>hbase.region.server.rpc.scheduler.factory.class</name>
    <value>org.apache.hadoop.hbase.ipc.PhoenixRpcSchedulerFactory</value>
<description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
</property>

<property>
    <name>hbase.rpc.controllerfactory.class</name>
    <value>org.apache.hadoop.hbase.ipc.controller.ServerRpcControllerFactory</value>
    <description>Factory to create the Phoenix RPC Scheduler that uses separate queues for index and metadata updates</description>
</property>

重启HBase

stop-hbase.sh
start-hbase.sh

连接 phoenix

/opt/module/phoenix/bin/sqlline.py hadoop101,hadoop102,hadoop103:2181

三、Phoenix操作

1、Phoenix 数据映射

Phoenix 将 HBase 的数据模型映射到关系型模型中。

在这里插入图片描述

Phoenix中的主键会作为rowkey,非主键列作为普通字段。默认使用0作为列族,也可以在建表时使用 列族.列名 作为字段名,显式指定列族。

如果主键是联合主键,则会将主键字段拼接作为rowkey。

2、Phoenix Shell操作

  • 登录Phoenix
/opt/module/phoenix/bin/sqlline.py hadoop101,hadoop102,hadoop103:2181
  • 创建表
CREATE TABLE IF NOT EXISTS student(
id VARCHAR primary key,
name VARCHAR,
addr VARCHAR);

在phoenix中,表名等会自动转换为大写,若要小写,使用双引号,如"us_population"。

CREATE TABLE IF NOT EXISTS "un_student"(
id VARCHAR primary key,
name VARCHAR,
addr VARCHAR);

在这里插入图片描述

在这里插入图片描述

#	指定多个列的联合作为RowKey
CREATE TABLE IF NOT EXISTS us_population (
State CHAR(2) NOT NULL,
City VARCHAR NOT NULL,
Population BIGINT
CONSTRAINT my_pk PRIMARY KEY (state, city));

注意:Phoenix中建表,会在HBase中创建一张对应的表。为了减少数据对磁盘空间的占用,Phoenix默认会对HBase中的列名做编码处理。具体规则可参考官网链接:https://phoenix.apache.org/columnencoding.html,若不想对列名编码,可在建表语句末尾加上COLUMN_ENCODED_BYTES = 0;

CREATE TABLE IF NOT EXISTS student(
id VARCHAR primary key,
name VARCHAR,
addr VARCHAR)
COLUMN_ENCODED_BYTES = 0
;
  • 插入或更新数据
upsert执行时,判断如果主键存在就更新,不存在则执行插入。
  • 插入或更新数据

upsert执行时,判断如果主键存在就更新,不存在则执行插入。

upsert into student values('1001','zhangsan','beijing');
  • 查询记录
select * from student;
select * from student where id='1001';
  • 删除记录
delete from student where id='1001';
  • 删除表
drop table student;
  • 退出命令行
!quit

3、Phoenix JDBC操作

3.1 胖客户端
  • 胖客户端指将Phoenix的所有功能都集成在客户端,导致客户端代码打包后体积过大。

pom依赖

<!--    胖客户端-->
<dependency>
    <groupId>org.apache.phoenix</groupId>
    <artifactId>phoenix-core</artifactId>
    <version>5.0.0-HBase-2.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.el</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.7.2</version>
</dependency>

测试代码:

import java.sql.*;

public class TestThickClient {
    public static void main(String[] args) throws SQLException {

        // 1.添加链接
        String url = "jdbc:phoenix:hadoop101,hadoop102,hadoop103:2181";

        // 2.获取连接
        Connection connection = DriverManager.getConnection(url);

        // 3.编译SQL语句
        PreparedStatement preparedStatement = connection.prepareStatement("select * from student");

        // 4.执行语句
        ResultSet resultSet = preparedStatement.executeQuery();

        System.out.println("===");
        // 5.输出结果
        while (resultSet.next()) {
            System.out.println(resultSet.getString(1) + ":" + resultSet.getString(2) + ":" + resultSet.getString(3));
        }

        // 6.关闭资源
        connection.close();
    }
}

在这里插入图片描述

3.2 瘦客户端
  • 瘦客户端指将Phoenix的功能进行拆解,主要功能由服务端提供,只使用轻量级的客户端向服务端发送请求。

服务上启动hadoop101

queryserver.py start

pom文件

<!--    瘦客户端-->
<dependency>
    <groupId>org.apache.phoenix</groupId>
    <artifactId>phoenix-queryserver-client</artifactId>
    <version>5.0.0-HBase-2.0</version>
</dependency>
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.21.4</version>
</dependency>

测试代码

import org.apache.phoenix.queryserver.client.ThinClientUtil;
import java.sql.*;

public class TestThinClient {
    public static void main(String[] args) throws SQLException {

        // 1. 直接从瘦客户端获取链接
        String hadoop102 = ThinClientUtil.getConnectionUrl("hadoop101", 8765);
        System.out.println(hadoop102);
        // 2. 获取连接
        Connection connection = DriverManager.getConnection(hadoop102);

        // 3.编译SQL语句
        PreparedStatement preparedStatement = connection.prepareStatement("select * from student");

        // 4.执行语句
        ResultSet resultSet = preparedStatement.executeQuery();

        // 5.输出结果
        while (resultSet.next()) {
            System.out.println(resultSet.getString(1) + ":" + resultSet.getString(2) + ":" + resultSet.getString(3));
        }

        // 6.关闭资源
        connection.close();
    }
}

在这里插入图片描述

四、Phoenix二级索引

1、为什么需要二级索引

  • 在HBase中查询时,必须指定rowkey。但是在Phoenix中,可以通过sql语句进行查询,在编写sql语句时,有事我们可能在不使用主键的情况下,进行过滤查询。此时好比是不使用rowkey,直接查询某一列。这样必须对某个表进行全表扫描,才能查询到指定的数据,效率低。
  • 二级索引是针对列的索引,通过建立二级索引,可以在不使用主键进行查询的场景中提升查询效率。

在这里插入图片描述

2、全局索引(global index)

  • Global Index是默认的索引格式,创建全局索引时,会在HBase中建立一张新表。也就是说索引数据和数据表是存放在不同的表中的,因此全局索引适用于多读少写的业务场景。
  • 写数据的时候会消耗大量开销,因为索引表也要更新,而索引表是分布在不同的数据节点上的,跨节点的数据传输带来了较大的性能消耗。
  • 在读数据的时候Phoenix会选择索引表来降低查询消耗的时间。

创建单个字段的全局索引

CREATE INDEX my_index ON my_table (my_col);

在这里插入图片描述

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

在这里插入图片描述

3、包含索引(covered index)

  • 包含索引会将指定的列作为rowkey,包含的列作为普通列建立索引。

创建携带其他字段的全局索引

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

在这里插入图片描述

4、本地索引(local index)

  • Local Index适用于写操作频繁的场景。
  • 在数据表中新建一个列族来存储索引数据。避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销。
CREATE LOCAL INDEX my_index ON my_table (my_column);

在这里插入图片描述

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

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

相关文章

基于SSM的网上手机销售系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

数据结构:堆的实现思路

我们之前写过堆的实现代码&#xff1a;数据结构&#xff1a;堆的实现-CSDN博客 这篇文章我们了解一下堆到底是如何实现的 1.堆向下调整算法 现在我们给出一个数组&#xff0c;逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整成一个小堆 向下调…

小米秒享3--非小米电脑

小米妙享中心是小米最新推出的一款功能&#xff0c;能够为用户们提供更加舒适便利的操作体验。简单的说可以让你的笔记本和你的小米手机联动&#xff0c;比如你在手机的文档&#xff0c;连接小米共享后&#xff0c;可以通过电脑进行操作。 对于非小米电脑想要体验终版秒享AIOT…

自带灯效的气传导耳机,声音当然好听,哈氪聆光体验

现在市场上的蓝牙耳机种类繁多&#xff0c;入耳式的算是主流&#xff0c;但不太适合户外使用 &#xff0c;我平时出门健身、散步的时候&#xff0c;更喜欢用气传导耳机。气传导耳机通常采用挂耳式的设计&#xff0c;耳机不入耳&#xff0c;佩戴舒适度更好&#xff0c;而且稳定性…

viple模拟器使用(四):unity模拟器中实现两距离局部最优迷宫算法

名字解读 两距离&#xff1a;指的是左侧距离和右侧距离 局部最优&#xff1a;对当前状态来说最好的选择&#xff0c;至于整体能不能达到最优&#xff0c;是无法确定的。 从节点1到节点5&#xff0c;一共有3条路 第1条路线&#xff1a;1→2→4→5&#xff0c;对应的花销是&…

Linux dig指令的十三种用法

文章目录 dig指令有哪些作用dig 具体用法推荐阅读 dig指令有哪些作用 DIG命令(Domain Information Groper命令)是一个网络工具&#xff0c;具有基本的命令行接口&#xff0c;用于进行不同的DNS(域名系统)查询。您可以使用DIG命令: 诊断您的域名服务器。检查所有这些服务器或每…

OpenWrt作为旁路由(网关)配置

目录 背景前提条件环境操作步骤物理层连接设置与主路由同一网段禁用IPv6取消LAN接口桥接防火墙配置 背景 本文简介如何配置OpenWrt&#xff0c;使其作为旁路由&#xff08;网关&#xff09;运行。 旁路由大概有以下这几种工作方式&#xff1a; 主路由开DHCP&#xff0c;网关未…

行为型剩余的模式

1.中介者模式 package com.jmj.pattern.mediator;public abstract class Mediator {public abstract void constact(String message,Person person); }package com.jmj.pattern.mediator;public class MediatorStructure extends Mediator{private HouseOwner houseOwner;priva…

Linux:dockerfile编写搭建nginx练习(8)

dockerfile是创建镜像的一种&#xff0c;通过已有镜像的基础上再在上面部署一些别的。 在这个基础镜像上搭建&#xff0c;我这个是一个空的centos镜像 我这里用http的yum仓库存放了nginx和rpm包 创建dockerfile vim Dockerfile写入#设置基础镜像 FROM centos#维护该镜像的用户…

C++ string类(1)—初始化、容量操作、迭代器

目录 前言 一、string类 二、初始化 1、无参或带参 2、用字符串变量初始化 3、用字符串初始化 4、指定数量字符 三、容量操作 1、size 2、push_back 3、append​编辑 4、运算符 5、reserve 6、resize 四、迭代器 1、正向迭代器 2、反向迭代器 3、const迭代器…

强化学习简明教程

到目前为止&#xff0c;我们主要关注监督学习问题&#xff08;主要是分类&#xff09;。 在监督学习中&#xff0c;我们得到某种由输入/输出对组成的训练数据&#xff0c;目标是能够在学习模型后根据一些新输入来预测输出。 例如&#xff0c;我们之前研究过 MNIST 的卷积神经网…

64. 最小路径和(Leetcode)

文章目录 前言一、题目分析二、算法原理1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值是什么 三、代码实现总结 前言 在本文章中&#xff0c;我们将要详细介绍一下Leetcode6最小路径相关的内容 一、题目分析 二、算法原理 1.状态表示 列出dp表&#xff0c;dp[i][j]代…

wvp gb28181 pro 平台国标级连功能说明

国标28181不同平台之间支持两种连接方式&#xff0c;平级和上下级&#xff0c;WVP目前支持向上级级联。 测试环境 测试平台上级&#xff1a;192.168.10.209&#xff08;Alam centos8&#xff09; 测试平台下级&#xff1a;192.168.10.206&#xff08;ky10_x86&#xff09; 下级…

OSG编程指南:专栏内容介绍及目录

1、专栏介绍 OpenSceneGraph&#xff08;OSG&#xff09;场景图形系统是一个基于工业标准 OpenGL 的软件接口&#xff0c;它让程序员能够更加快速、便捷地创建高性能、跨平台的交互式图形程序。本专栏基于 OSG 3.6.5版本进行源码的编写及扩展&#xff0c;也通用于其他OSG版本的…

算法通关村第十三关-黄金挑战数论问题

计数质数 描述 : 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 题目 : LeetCode 204.计数质数 : 204. 计数质数 分析 : 解决这个题有一个有效的方法&#xff0c;叫埃氏筛 , 后来又产生了线性筛&#xff0c;奇数筛等改进的方法。 基本思想是如果 x是…

基于SSM的新闻网站浏览管理实现与设计

基于ssm的新闻网站浏览管理实现与设计 摘要&#xff1a;在大数据时代下&#xff0c;科技与技术日渐发达的时代&#xff0c;人们不再局限于只获取自己身边的信息&#xff0c;而是对全球信息获取量也日渐提高&#xff0c;网络正是打开这新世纪大门的钥匙。在传统方式下&#xff…

逸学java【初级菜鸟篇】12.网络通讯编程

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 目标&#xff08;任务驱动&#xff09; 请练掌网络通讯的内容。 局域网和互联网 局域网英文&#xff1a;Local Area Network&#xff0c;缩写&#xff1a;LAN&#xff0c;是指一群通过一定形式连接起来的计算机&#xff0c;…

【并发编程】CopyOnWriteArrayList详解与原理

&#x1f4eb;作者简介&#xff1a;小明Java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

Python函数的基本使用(一)

Python函数的基本使用&#xff08;一&#xff09; 一、函数概述二、函数的定义2.1 函数的语法2.2 语法说明2.3 函数定义的方式2.4 总结 三、函数的调用3.1 函数调用语法3.2 语法说明3.3 函数调用 四、函数的参数4.1 参数的分类4.2 必需参数4.3 默认值参数4.4 关键字参数4.5 不定…

JavaEE 多线程

JavaEE 多线程 文章目录 JavaEE 多线程引子多线程1. 特性2. Thread类2.1 概念2.2 Thread的常见构造方法2.3 Thread的几个常见属性2.4 启动一个线程2.5 中断一个线程2.6 等待一个线程2.7 获取当前线程引用2.8 休眠当前线程 3. 线程状态 引子 当进入多线程这一块内容时&#xff…
最新文章