大数据学习栈记——HBase操作(shell java)
本文介绍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 keyString 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();// 输出rowkeySystem.out.println("rowKey= " + Bytes.toString(result.getRow()));// 遍历所有的cellfor (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的记录。

相关文章:
大数据学习栈记——HBase操作(shell java)
本文介绍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/d…...
React多层级对象改变值--immer
reduxjs/toolkit底层就是immer,,,所以在使用redux的时候,直接赋值,就会响应式的数据 如果不使用reduxjs/toolkit,可以自己使用immer来实现 安装immer npm install immer引入produce函数,,prod…...
服务器硬盘爆满100%问题解决
问题 在工作中遇到一个服务器,服务器硬盘100%,查找哪个目录文件中占用大量空间。发现加起来才150G,硬盘空间大概有500G。 处理问题,排查是否有某个进程正在删除文件,进程卡住了,所以过滤一下有哪些进程&am…...
智能制造:物联网和自动化之间的关系
工业自动化 工业自动化是机器设备或生产过程在不需要人工直接干预的情况下按预期的目标实现测量、操纵等信息处理和过程控制的统称。 在传统的工业生产过程中,很多环节需要人工操作,比如设备调试、生产监控、质量检测等。然而,随着工业自动化…...
Axure项目实战:智慧城市APP(三)教育查询(显示与隐藏交互)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:教育查询 主要内容:教育公告信息,小升初、初升高、高考成绩查询;教育公告信息为传统的信息页面,小升…...
01 设计模式和设计原则
类设计原则: 单一职责原则(Single Responsibility Principle,SRP):实现类要职责单一开闭原则(Open Close Principle,OCP):对扩展开放,对修改关闭里氏替换原则…...
Github 2025-03-23 php开源项目日报Top10
根据Github Trendings的统计,今日(2025-03-23统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10TypeScript项目1JavaScript项目1Shell项目1Laravel: 以优雅语法简化Web开发 创建周期:4028 天开发语言:PHP协议类型:MIT LicenseSt…...
macbook电脑如何清理键盘防止误触
M1芯片的MacBook电脑关机后按任意键开机,是苹果的功能设计。这样设计的目的是为了方便用户,让用户在想要使用电脑时能快速开机。但是清理电脑键盘的时候却成为了一种苦恼 以下是一些清理 MacBook 键盘防止误触的方法: 使用工具锁定键盘 Cle…...
AIMB-ASMB-788B(PPC-MB-620B)RAID驱动安装(笔记版)
创建RAID后安装系统时看不到磁盘信息,以下案例是安装windows10系统时如何安装主板RAID驱动,由于是笔记版不做过多介绍。 RAID驱动链接:https://advdownload.advantech.com.cn/productfile/Downloadfile1/1-2MAHDQD/AIMB-788_788E_RAID_AHCI_…...
深度分页优化思路
深度分页优化思路 思考以下问题 查询以下SQL的流程是怎么样的呢? 为什么只查询10条数据需要7秒? # 查询时间7秒 SELECT * FROM user ORDER BY age LIMIT 1000000, 10问题分析 为什么分页查询随着翻页的深入,会变得越来越慢。 其实࿰…...
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步:基…...
HarmonyOS NEXT(九) :图形渲染体系
HarmonyOS NEXT(九) :图形渲染体系 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 文章目录 HarmonyOS NEXT࿰…...
SQLAlchemy关键词搜索技术深度解析:从基础过滤到全文检索
在数据驱动的应用开发中,基于关键词的模糊查询是常见的业务需求。SQLAlchemy作为Python生态中最流行的ORM框架,提供了多种实现关键词搜索的技术方案。本文将从性能、适用场景和技术复杂度三个维度,系统对比分析SQLAlchemy中关键词搜索的最佳实…...
ES数据过多,索引拆分
公司企微聊天数据存储在 ES 中,虽然按照企业分储在不同的ES 索引中,但某些常用的企微主体使用量还是很大。4年中一个索引存储数据已经达到46多亿条数据,占用存储3.1tb, ES 配置 由于多一个副本,存储得翻倍,成本考虑…...
Rust 与 FFmpeg 实现视频水印添加:技术解析与应用实践
引言 在短视频、直播、影视制作等领域,视频水印是一种常见的工具,用于保护版权、提升品牌辨识度或满足合规性要求。然而,开发者在实现水印添加时往往面临以下挑战: 手动处理效率低:使用图像编辑软件(如 P…...
Python语言的游戏物理
Python语言的游戏物理 引言 在现代游戏开发中,物理引擎是一个重要的组成部分,通过模拟真实世界的物理现象,增加了游戏的沉浸感和可玩性。Python作为一种高效、易用的编程语言,虽然在性能方面不如C等语言,但其灵活性和…...
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:新增一个新员工培训页面 功能25:角色管理 功能24:菜单管理 功能23:从后端获取路由/菜单数据 功能22:用户管理 功能21:使用axios发送请求 功能20:使用分页插件 功能19:集成My…...
逻辑回归(Logistic Regression)模型的概率预测函数
以二分类问题为例,常见的损失函数有 负对数似然损失(neg log-likelihood loss),交叉熵损失(cross entropy loss),deviance loss指数损失(exponential loss)。 前三者虽然名字不同,但却具有相同的表达形式。此外,neg …...
【零基础学python】python高级语法(四)
接续上面的系列文章: 【零基础学python】python基础语法(一)-CSDN博客 【零基础学python】python基础语法(二)-CSDN博客 【零基础学python】python高级语法(三)-CSDN博客 目录 2,…...
HarmonyOS 之 @Require 装饰器自学指南
在 HarmonyOS 应用开发工作中,我频繁碰到组件初始化传参校验的难题。在复杂的组件嵌套里,要是无法确保必要参数在构造时准确传入,就极易引发运行时错误,而且排查起来费时费力。一次偶然的机会,我接触到了 Require 装饰…...
Redis Cluster 详解
Redis Cluster 详解 1. 为什么需要 Redis Cluster? Redis 作为一个高性能的内存数据库,在单机模式下可能会遇到以下问题: 单机容量受限:Redis 是基于内存存储的,单机的内存资源有限,单实例的 Redis 只能…...
基于CNN的FashionMNIST数据集识别6——ResNet模型
前言 之前我们在cnn已经搞过VGG和GoogleNet模型了,这两种较深的模型出现了一些问题: 梯度传播问题 在反向传播过程中,梯度通过链式法则逐层传递。对于包含 L 层的网络,第 l 层的梯度计算为: 其中 a(k) 表示第 k层的…...
0323-B树、B+树
多叉树---->B树(磁盘)、B树 磁盘由多个盘片组成,每个盘片分为多个磁道和扇区。数据存储在这些扇区中,扇区之间通过指针链接,形成链式结构。 内存由连续的存储单元组成,每个单元有唯一地址,数…...
深度学习3-pytorch学习
深度学习3-pytorch学习 Tensor 定义与 PyTorch 操作 1. Tensor 定义: Tensor 是 PyTorch 中的数据结构,类似于 NumPy 数组。可以通过不同方式创建 tensor 对象: import torch# 定义一个 1D Tensor x1 torch.Tensor([3, 4])# 定义一个 Fl…...
【工作记录】F12查看接口信息及postman中使用
可参考 详细教程:如何从前端查看调用接口、传参及返回结果(附带图片案例)_f12查看接口及参数-CSDN博客 1、接口信息 接口基础知识2:http通信的组成_接口请求信息包括-CSDN博客 HTTP类型接口之请求&响应详解 - 三叔测试笔记…...
正则表达式-万能表达式
1、正则 正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找 出满足你想要的格式的句子. {“basketId”: 0, “count”: 1, “prodId”: #prodId#, “shopId”: 1, “skuId”: #skuId#} #prodId# re相关的文章: https://www.cnblogs.com/Simple-S…...
2024年认证杯SPSSPRO杯数学建模B题(第二阶段)神经外科手术的定位与导航全过程文档及程序
2024年认证杯SPSSPRO杯数学建模 B题 神经外科手术的定位与导航 原题再现: 人的大脑结构非常复杂,内部交织密布着神经和血管,所以在大脑内做手术具有非常高的精细和复杂程度。例如神经外科的肿瘤切除手术或血肿清除手术,通常需要…...
Android 12系统源码_系统启动(二)Zygote进程
前言 Zygote(意为“受精卵”)是 Android 系统中的一个核心进程,负责 孵化(fork)应用进程,以优化应用启动速度和内存占用。它是 Android 系统启动后第一个由 init 进程启动的 Java 进程,后续所有…...
MOSN(Modular Open Smart Network)-05-MOSN 平滑升级原理解析
前言 大家好,我是老马。 sofastack 其实出来很久了,第一次应该是在 2022 年左右开始关注,但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFAStack-00-sofa 技术栈概览 MOSN(Modular O…...
