点一下关注吧!!!非常感谢!!持续更新!!!
🚀 AI 篇持续更新中!(长期更新)
AI 炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用 AI 工具指南!📐🤖
💻 Java 篇正式开启!(300 篇)
目前 2025 年 07 月 10 日更新到:Java-68 深入浅出 分布式服务 Netty 实现自定义 RPC 附详细代码 MyBatis 已完结,Spring 已完结,Nginx 已完结,Tomcat 已完结,分布式服务正在更新!深入浅出助你打牢基础!
📊 大数据板块已完成多项干货更新(300 篇):
包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT 案例 详解
章节内容
上一节我们完成了:
HBase Shell 的使用
HBase 增、删、改、查等操作
HBase 列族相关的操作
背景介绍
这里是三台公网云服务器,每台 2C4G,搭建一个 Hadoop 的学习环境,供我学习。
2C4G 编号 h121
2C4G 编号 h122
2C2G 编号 h123
HBase 项目详细介绍
项目简介
HBase (Hadoop Database) 是一款基于 Google 的 BigTable 论文设计而来的开源分布式数据库系统。它属于列式存储的非关系型数据库(NoSQL),专门用于处理超大规模数据集的实时随机读写需求。
与传统的关系型数据库如 MySQL 相比,HBase 采用了完全不同的存储方式:
行式存储 vs 列式存储:MySQL 采用行式存储,即使某些字段为空也会占用存储空间;而 HBase 采用列式存储,空字段不会浪费空间
存储容量:MySQL 单表通常限制在百万到千万级数据,而 HBase 可以轻松存储 PB 级数据
扩展方式:MySQL 主要通过垂直扩展(升级硬件),HBase 则支持水平扩展(增加节点)
核心特性
海量数据存储能力
支持 PB 级别大数据存储,单集群可存储超过 100TB 至 PB 级数据
采用分布式存储架构,数据自动分片存储在多个数据节点
支持数据压缩存储,可节省 50%以上的存储空间
典型应用场景:互联网用户行为日志、物联网传感器数据、金融交易记录等海量数据存储
高可用与横向扩展
采用主从架构,RegionServer 作为数据节点可动态扩展
支持在线添加节点,扩容过程不影响业务运行
理论上可以实现存储容量和计算能力的线性增长
每个 RegionServer 管理多个 Region(数据分区),自动负载均衡
典型配置:初始 3 节点,可扩展至上百节点处理 PB 级数据
列族存储
强一致性
提供行级 ACID 事务保证
支持跨行事务,确保相关操作同时成功或失败
采用 MVCC(多版本并发控制)实现读写不阻塞
WAL(预写日志)确保数据持久性
典型应用:金融转账、库存管理等需要强一致性的场景
快速随机读写
多层存储结构:MemStore(内存)+HFile(磁盘)+BlockCache(缓存)
热数据优先缓存在内存,响应时间通常<10ms
支持批量写入和异步刷新机制
BloomFilter 加速查询,避免无效磁盘 IO
典型性能:单节点每秒可处理数万次读写操作 ## 核心特性
海量数据存储能力
支持 PB 级别大数据存储,单集群可存储超过 100TB 至 PB 级数据
采用分布式存储架构,数据自动分片存储在多个数据节点
支持数据压缩存储,可节省 50%以上的存储空间
典型应用场景:互联网用户行为日志、物联网传感器数据、金融交易记录等海量数据存储
高可用与横向扩展
采用主从架构,RegionServer 作为数据节点可动态扩展
支持在线添加节点,扩容过程不影响业务运行
理论上可以实现存储容量和计算能力的线性增长
每个 RegionServer 管理多个 Region(数据分区),自动负载均衡
典型配置:初始 3 节点,可扩展至上百节点处理 PB 级数据
列族存储
强一致性
提供行级 ACID 事务保证
支持跨行事务,确保相关操作同时成功或失败
采用 MVCC(多版本并发控制)实现读写不阻塞
WAL(预写日志)确保数据持久性
典型应用:金融转账、库存管理等需要强一致性的场景
快速随机读写
新建工程
新建一个 Maven 工程,这里就跳过了,不重复描述了。
POM
更新我们的 POM 文档,加入如下的依赖:
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.3.1</version>
</dependency>
复制代码
建立新表
public class Test01 {
public static void main(String[] args) throws IOException {
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "h121.wzk.icu,h122.wzk.icu");
configuration.set("hbase.zookeeper.property.clientPort", "2181");
Connection connection = ConnectionFactory.createConnection(configuration);
HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();
// 创建表描述器
HTableDescriptor descriptor = new HTableDescriptor(TableName.valueOf("test01"));
// 设置列族描述器
descriptor.addFamily(new HColumnDescriptor("base_info"));
// 建立表
admin.createTable(descriptor);
System.out.println("test01 表建立完毕");
admin.close();
connection.close();
}
}
复制代码
运行上面的代码,可以得到如下的结果:
插入数据
public class Test02 {
public static void main(String[] args) throws IOException {
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "h121.wzk.icu,h122.wzk.icu");
configuration.set("hbase.zookeeper.property.clientPort", "2181");
Connection connection = ConnectionFactory.createConnection(configuration);
HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();
// 插入数据
Table table = connection.getTable(TableName.valueOf("test01"));
// 设定 row key
Put put = new Put(Bytes.toBytes("rk1"));
// 列族 列 值
put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name"), Bytes.toBytes("wuzikang"));
// 执行插入
table.put(put);
table.close();
System.out.println("rk1 base_info:name wuzikang 数据插入成功!");
admin.close();
connection.close();
}
}
复制代码
运行可以获得如下的结果:
删除数据
public class Test03 {
public static void main(String[] args) throws IOException {
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "h121.wzk.icu,h122.wzk.icu");
configuration.set("hbase.zookeeper.property.clientPort", "2181");
Connection connection = ConnectionFactory.createConnection(configuration);
HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();
// 删除数据
Table table02 = connection.getTable(TableName.valueOf("test01"));
Delete delete = new Delete(Bytes.toBytes("rk1"));
table02.delete(delete);
table02.close();
System.out.println("rk1 数据删除成功!");
admin.close();
connection.close();
}
}
复制代码
运行可以获得如下的结果:
获取列族
public class Test04 {
public static void main(String[] args) throws IOException {
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "h121.wzk.icu,h122.wzk.icu");
configuration.set("hbase.zookeeper.property.clientPort", "2181");
Connection connection = ConnectionFactory.createConnection(configuration);
HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();
// 获取某个列族信息
HTable table = (HTable) connection.getTable(TableName.valueOf("test01"));
Get get = new Get(Bytes.toBytes("rk1"));
get.addFamily(Bytes.toBytes("base_info"));
// 执行查询
Result result = table.get(get);
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String cf = Bytes.toString(CellUtil.cloneFamily(cell));
String column = Bytes.toString(CellUtil.cloneQualifier(cell));
String value = Bytes.toString(CellUtil.cloneValue(cell));
String rowKey = Bytes.toString(CellUtil.cloneRow(cell));
System.out.println("rowKey: " + rowKey + ", " + cf + ", " + column + ", " + value);
}
table.close();
admin.close();
connection.close();
}
}
复制代码
运行可以获得如下的结果:
扫描全表
public class Test05 {
public static void main(String[] args) throws IOException {
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "h121.wzk.icu,h122.wzk.icu");
configuration.set("hbase.zookeeper.property.clientPort", "2181");
Connection connection = ConnectionFactory.createConnection(configuration);
HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();
HTable table = (HTable) connection.getTable(TableName.valueOf("test01"));
Scan scan = new Scan();
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String cf = Bytes.toString(CellUtil.cloneFamily(cell));
String column = Bytes.toString(CellUtil.cloneQualifier(cell));
String value = Bytes.toString(CellUtil.cloneValue(cell));
String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
System.out.println("rowKey: " + rowkey + ", " + cf + ", " + column + ", " + value);
}
}
table.close();
admin.close();
connection.close();
}
}
复制代码
运行可以获得如下结果:
Scan+Row
public class Test06 {
public static void main(String[] args) throws IOException {
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum", "h121.wzk.icu,h122.wzk.icu");
configuration.set("hbase.zookeeper.property.clientPort", "2181");
Connection connection = ConnectionFactory.createConnection(configuration);
HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();
HTable table = (HTable) connection.getTable(TableName.valueOf("test01"));
Scan scan = new Scan();
scan.setStartRow("rk1".getBytes());
scan.setStopRow("rk2".getBytes());
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
String cf = Bytes.toString(CellUtil.cloneFamily(cell));
String column = Bytes.toString(CellUtil.cloneQualifier(cell));
String value = Bytes.toString(CellUtil.cloneValue(cell));
String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
System.out.println("rowKey: " + rowkey + ", " + cf + ", " + column + ", " + value);
}
}
table.close();
admin.close();
connection.close();
}
}
复制代码
评论