大数据学习栈记——HBase操作(shell java)

news2025/3/31 0:47:08

本文介绍HBase在shell终端的常见操作以及如何利用java api操作HBase,操作系统:Ubuntu24.04

参考:

https://blog.51cto.com/u_16099228/8016429

https://blog.csdn.net/m0_37739193/article/details/73618899

https://cloud.tencent.com/developer/article/1936188

启动HBase

Hbase操作主要包括两种模式:通过Shell输入命令或者通过编程语言(Java、Python等)调用API

首先启动Hbase,顺序为:

启动Hadoop → 启动Zookeeper → 启动HBase

start-all.sh

zkp start

start-hbase.sh

HBase Shell模式

进入HBase Shell模式,在hadoop101:

hbase shell   #进入HBase shell 命令行模式

如果需要退出HBase Shell模式,在hadoop101上执行:

exit

如果在运行过程中出现了超时的日志,可以忽略,打回车即可

1. 在HBase中创建表(Shell模式)

假设这里要创建一个表student,该表包含Sname、Ssex、Sage、Sdept、course等字段。需要注意的是,在关系型数据库(比如MySQL)中,需要首先创建数据库,然后再创建表,但是,在HBase数据库中,不需要创建数据库,只要直接创建表就可以。按照PPT教程,在HBase中创建student表的Shell命令如下:

create 'student','Sname','Ssex','Sage','Sdept','course'

这里的各个字符表示的是列族,一个HBase表最多可以有32个列族。超过这个限制会导致表的创建或修改失败,但通常情况下不需要那么多的列族。列族多的话,会给HBase带来很多问题(这个是一个常见的考点!)。

另外,仔细体会一下,HBase建表时,仅仅建立了列族,没有建立列。列是在put数据的时候才出现的。

2. 在HBase中查看表信息(Shell模式)

创建完“student”表后,可通过describe命令查看“student”表的基本信息。

describe ‘student’

可以使用list命令查看当前HBase数据库中已经创建了哪些表,命令如下:

list

3. 在HBase中添加数据(Shell模式)

可以用Shell命令手工插入数据,命令如下:

put 'student','95001','Sname','LiYing'

HBase 使用 put 命令可以向数据表中插入一行新的数据,或者覆盖指定行的数据。put 命令一次只能插入一个单元格的数据:

put 'namespace:table','RowKey','CF:CQ','value', timestamp

  • 第一个参数 namespace:table 为指定命名空间下的表名。
  • 第二个参数RowKey为行键的名称,字符串类型。
  • 第三个参数CF:CQ为列族和列的名称。列族名必须是已经创建的,否则 HBase 会报错;列名是临时定义的,因此列族里的列是可以随意扩展的。
  • 第四个参数value为单元格的值。在 HBase 里,所有数据都是字符串的形式。
  • 最后一个参数timestamp为时间戳,如果不设置时间戳,则系统会自动插入当前的时间作为时间戳。

继续添加4个单元格的数据,用来记录LiYing同学的相关信息,命令如下:

put 'student','95001','Ssex','male'

put 'student','95001','Sage','22'

put 'student','95001','Sdept','CS'

put 'student','95001','course:math','80'

解释:这里的course:math表示在course列族下面新建了一个math列,成绩为80分

4. 删除表(Shell模式)

删除表需要分两步操作,第一步先让该表不可用,第二步删除表。比如,要删除student表,可以使用如下命令:

disable 'student' 

drop 'student'

7. 查询历史数据(Shell模式)

为了查询历史数据,这里创建一个teacher表,首先,在创建表的时候,需要指定保存的版本数(假设指定为5),命令如下:

create 'teacher',{NAME=>'username',VERSIONS=>5}

创建表的完整语法:

create <table>, {NAME => <family>,VERSIONS => <VERSIONS>}

然后,插入数据,并更新数据,使其产生历史版本数据,需要注意的是,这里插入数据和更新数据都是使用put命令,具体如下:

put 'teacher','91001','username','Mary'

put 'teacher','91001','username','Mary1'

put 'teacher','91001','username','Mary2'

put 'teacher','91001','username','Mary3'

put 'teacher','91001','username','Mary4'

put 'teacher','91001','username','Mary5'

查询时,默认情况下回显示当前最新版本的数据,如果要查询历史数据,需要指定查询的历史版本数,由于上面设置了保存版本数为5,所以,在查询时制定的历史版本数的有效取值为1到5,具体命令如下:

get 'teacher','91001',{COLUMN=>'username',VERSIONS=>5}

get 'teacher','91001',{COLUMN=>'username',VERSIONS=>3}

HBase Java API

1. 导入maven依赖

首先,找到hbase的jar包

输入HBase后,找到很多包

通过https://blog.51cto.com/u_16213369/9390696这篇文章和PPT中的源代码,感觉我们是需要HBase Client包,点击Apache HBase Client,

我安装的HBase是2.5.8版本,hadoop是3.3.6,应该就是2.5.8-hadoop3这个配置吧

在pom.xml里添加

<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->

<dependency>

    <groupId>org.apache.hbase</groupId>

    <artifactId>hbase-client</artifactId>

    <version>2.5.8-hadoop3</version>

</dependency>

随后刷新

2. 与HBase建立连接(Java模式)

参考:

https://www.cnblogs.com/yxym2016/p/14698745.html

HBase学习四之JAVA编程_tabledescriptorbuilder-CSDN博客

在网上找了一个模板,简化了一下,并且按照我的配置设置了参数。代码如下:

package HBase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
// import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class TestHBase {

    public static void main(String[] args) {
        try {
            // 获取配置文件信息
            Configuration conf = HBaseConfiguration.create();
            conf.set("hbase.zookeeper.quorum", "hadoop101,hadoop102,hadoop103");   // 我的三台zookeeper服务器是master、node1和node2
            // 建立连接,获取connection对象
            Connection connection = ConnectionFactory.createConnection(conf);
            // 获取admin对象,用于建表、删表等
            Admin admin = connection.getAdmin();

            /*
            在中间编写代码即可
            */

            // 关闭资源
            admin.close();
            connection.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 在HBase建立表和增加数据(Java模式)

代码如下:

package HBase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;

public class Database {

    public static void main(String[] args) {
        try {
            // 获取配置文件信息
            Configuration conf = HBaseConfiguration.create();
            conf.set("hbase.zookeeper.quorum", " hadoop101,hadoop102,hadoop103");  // 我的三台zookeeper服务器是master、node1和node2
            // 建立连接,获取connection对象
            Connection connection = ConnectionFactory.createConnection(conf);
            // 获取admin对象
            Admin admin = connection.getAdmin();
            // 准备创建一张student表,有两个列族info和course
            // 构建表描述构建器,一张表只需要一个
            TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf("student"));
            // 构建列族描述构建器,每个列族需要一个
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder1 = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("info"));
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder2 = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("course"));
            // 构建列族描述,每个列族描述构建器可以构建一个
            ColumnFamilyDescriptor columnFamilyDescriptor1 = columnFamilyDescriptorBuilder1.build();
            ColumnFamilyDescriptor columnFamilyDescriptor2 = columnFamilyDescriptorBuilder2.build();
            // 添加列族,由于有多个列族,所以需要先构造一个Connection对象,然后使用tableDescriptorBuilder.setColumnFamilies()方法
            Collection<ColumnFamilyDescriptor> families = Arrays.asList(columnFamilyDescriptor1, columnFamilyDescriptor2);
            tableDescriptorBuilder.setColumnFamilies(families);
            // 如果只有一个列族,就用下面这个方法
            // tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptor);
            // 构建表描述
            TableDescriptor tableDescriptor = tableDescriptorBuilder.build();
            // 创建表
            admin.createTable(tableDescriptor);
            // 获得表student的table对象
            TableName tableName = TableName.valueOf("student");
            Table table = connection.getTable(tableName);
            // 定义第一个row key
            String rowKey1 = "0001";
            // 构建Put对象,对应put命令
            Put put = new Put(Bytes.toBytes(rowKey1));
            // 添加列,第一个参数是列族名,第二个参数是列名,第三个参数是值
            put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("tom"));
            put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("gender"), Bytes.toBytes("male"));
            put.addColumn(Bytes.toBytes("course"), Bytes.toBytes("math"), Bytes.toBytes("80"));
            // 将数据插入数据库
            table.put(put);
            // 关闭表
            table.close();
            // 关闭资源
            admin.close();
            connection.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用下列shell命令查看数据,发现数据成功写入HBase中的student表

get 'student','0001'

4. 在HBase查询数据(Java模式)

代码如下:

package HBase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;
import java.util.List;

public class Query {

    public static void main(String[] args) {
        try {
            // 获取配置文件信息
            Configuration conf = HBaseConfiguration.create();
            conf.set("hbase.zookeeper.quorum", "hadoop101,hadoop102,hadoop103");  // 我的三台zookeeper服务器是master、node1和node2
            // 建立连接,获取connection对象
            Connection connection = ConnectionFactory.createConnection(conf);
            // 获取admin对象,用于建表、删表等
            Admin admin = connection.getAdmin();
            // 获得表student的table对象
            TableName tableName = TableName.valueOf("student");
            Table table = connection.getTable(tableName);
            // 获得rowkey为0001的get对象
            Get get = new Get(Bytes.toBytes("0001"));
            // 得到查询结果
            Result result = table.get(get);
            // 得到单元格列表
            List<Cell> cells = result.listCells();
            // 输出rowkey
            System.out.println("rowKey= " + Bytes.toString(result.getRow()));
            // 遍历所有的cell
            for (Cell cell : cells) {
                // 输出列名
                System.out.print(Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) + ":");
                // 输出单元格的值
                System.out.println(Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
            }
            // 关闭表格
            table.close();
            // 关闭资源
            admin.close();
            connection.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

执行完成后,在IDEA的控制台可以看到下面的信息,成功输出rowkey为0001的记录。

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

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

相关文章

智能制造:物联网和自动化之间的关系

工业自动化 工业自动化是机器设备或生产过程在不需要人工直接干预的情况下按预期的目标实现测量、操纵等信息处理和过程控制的统称。 在传统的工业生产过程中&#xff0c;很多环节需要人工操作&#xff0c;比如设备调试、生产监控、质量检测等。然而&#xff0c;随着工业自动化…

Axure项目实战:智慧城市APP(三)教育查询(显示与隐藏交互)

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;教育查询 主要内容&#xff1a;教育公告信息&#xff0c;小升初、初升高、高考成绩查询&#xff1b;教育公告信息为传统的信息页面&#xff0c;小升…

01 设计模式和设计原则

类设计原则&#xff1a; 单一职责原则&#xff08;Single Responsibility Principle&#xff0c;SRP&#xff09;&#xff1a;实现类要职责单一开闭原则&#xff08;Open Close Principle&#xff0c;OCP&#xff09;&#xff1a;对扩展开放&#xff0c;对修改关闭里氏替换原则…

Github 2025-03-23 php开源项目日报Top10

根据Github Trendings的统计,今日(2025-03-23统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10TypeScript项目1JavaScript项目1Shell项目1Laravel: 以优雅语法简化Web开发 创建周期:4028 天开发语言:PHP协议类型:MIT LicenseSt…

AIMB-ASMB-788B(PPC-MB-620B)RAID驱动安装(笔记版)

创建RAID后安装系统时看不到磁盘信息&#xff0c;以下案例是安装windows10系统时如何安装主板RAID驱动&#xff0c;由于是笔记版不做过多介绍。 RAID驱动链接&#xff1a;https://advdownload.advantech.com.cn/productfile/Downloadfile1/1-2MAHDQD/AIMB-788_788E_RAID_AHCI_…

深度分页优化思路

深度分页优化思路 思考以下问题 查询以下SQL的流程是怎么样的呢&#xff1f; 为什么只查询10条数据需要7秒&#xff1f; # 查询时间7秒 SELECT * FROM user ORDER BY age LIMIT 1000000, 10问题分析 为什么分页查询随着翻页的深入&#xff0c;会变得越来越慢。 其实&#xff0…

K8S学习之基础五十四:jenkins新建测试流水线

jenkins新建测试流水线 新建任务 node(testak) {stage(第1步:从gitee上下载源代码) {git url: "https://gitee.com/akang007/jenkins-sample"script {build_tag sh(returnStdout: true, script: git rev-parse --short HEAD).trim()}}stage(第2步&#xff1a;基…

HarmonyOS NEXT(九) :图形渲染体系

HarmonyOS NEXT&#xff08;九&#xff09; &#xff1a;图形渲染体系 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 文章目录 HarmonyOS NEXT&#xff0…

SQLAlchemy关键词搜索技术深度解析:从基础过滤到全文检索

在数据驱动的应用开发中&#xff0c;基于关键词的模糊查询是常见的业务需求。SQLAlchemy作为Python生态中最流行的ORM框架&#xff0c;提供了多种实现关键词搜索的技术方案。本文将从性能、适用场景和技术复杂度三个维度&#xff0c;系统对比分析SQLAlchemy中关键词搜索的最佳实…

ES数据过多,索引拆分

公司企微聊天数据存储在 ES 中&#xff0c;虽然按照企业分储在不同的ES 索引中&#xff0c;但某些常用的企微主体使用量还是很大。4年中一个索引存储数据已经达到46多亿条数据&#xff0c;占用存储3.1tb, ES 配置 由于多一个副本&#xff0c;存储得翻倍&#xff0c;成本考虑…

uni-app自动升级功能

效果图 一、VUE login.vue <template><view><view class"uni-common-mt"><view class"uni-flex uni-column"><view class"flex-item flex-item-V"><view class"logo"><image src"/st…

使用AI一步一步实现若依(26)

功能26&#xff1a;新增一个新员工培训页面 功能25&#xff1a;角色管理 功能24&#xff1a;菜单管理 功能23&#xff1a;从后端获取路由/菜单数据 功能22&#xff1a;用户管理 功能21&#xff1a;使用axios发送请求 功能20&#xff1a;使用分页插件 功能19&#xff1a;集成My…

逻辑回归(Logistic Regression)模型的概率预测函数

以二分类问题为例&#xff0c;常见的损失函数有 负对数似然损失(neg log-likelihood loss)&#xff0c;交叉熵损失(cross entropy loss)&#xff0c;deviance loss指数损失(exponential loss)。 前三者虽然名字不同&#xff0c;但却具有相同的表达形式。此外&#xff0c;neg …

【零基础学python】python高级语法(四)

接续上面的系列文章&#xff1a; 【零基础学python】python基础语法&#xff08;一&#xff09;-CSDN博客 【零基础学python】python基础语法&#xff08;二&#xff09;-CSDN博客 【零基础学python】python高级语法&#xff08;三&#xff09;-CSDN博客 目录 2&#xff0c…

HarmonyOS 之 @Require 装饰器自学指南

在 HarmonyOS 应用开发工作中&#xff0c;我频繁碰到组件初始化传参校验的难题。在复杂的组件嵌套里&#xff0c;要是无法确保必要参数在构造时准确传入&#xff0c;就极易引发运行时错误&#xff0c;而且排查起来费时费力。一次偶然的机会&#xff0c;我接触到了 Require 装饰…

基于CNN的FashionMNIST数据集识别6——ResNet模型

前言 之前我们在cnn已经搞过VGG和GoogleNet模型了&#xff0c;这两种较深的模型出现了一些问题&#xff1a; 梯度传播问题 在反向传播过程中&#xff0c;梯度通过链式法则逐层传递。对于包含 L 层的网络&#xff0c;第 l 层的梯度计算为&#xff1a; 其中 a(k) 表示第 k层的…

0323-B树、B+树

多叉树---->B树&#xff08;磁盘&#xff09;、B树 磁盘由多个盘片组成&#xff0c;每个盘片分为多个磁道和扇区。数据存储在这些扇区中&#xff0c;扇区之间通过指针链接&#xff0c;形成链式结构。 内存由连续的存储单元组成&#xff0c;每个单元有唯一地址&#xff0c;数…

【工作记录】F12查看接口信息及postman中使用

可参考 详细教程&#xff1a;如何从前端查看调用接口、传参及返回结果&#xff08;附带图片案例&#xff09;_f12查看接口及参数-CSDN博客 1、接口信息 接口基础知识2&#xff1a;http通信的组成_接口请求信息包括-CSDN博客 HTTP类型接口之请求&响应详解 - 三叔测试笔记…

2024年认证杯SPSSPRO杯数学建模B题(第二阶段)神经外科手术的定位与导航全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 B题 神经外科手术的定位与导航 原题再现&#xff1a; 人的大脑结构非常复杂&#xff0c;内部交织密布着神经和血管&#xff0c;所以在大脑内做手术具有非常高的精细和复杂程度。例如神经外科的肿瘤切除手术或血肿清除手术&#xff0c;通常需要…

Android 12系统源码_系统启动(二)Zygote进程

前言 Zygote&#xff08;意为“受精卵”&#xff09;是 Android 系统中的一个核心进程&#xff0c;负责 孵化&#xff08;fork&#xff09;应用进程&#xff0c;以优化应用启动速度和内存占用。它是 Android 系统启动后第一个由 init 进程启动的 Java 进程&#xff0c;后续所有…