HBase数据读写示例程序如何编写,HBase存储原理是什么

HBase数据读写示例程序的核心操作是Put和Get,通过Java API可以快速实现数据的写入和读取,掌握这些示例代码是HBase开发的基础。

HBase数据读写示例程序:Put与Get操作详解

HBase的读写操作分别对应Put和Get两个核心类,Put负责写入数据,Get负责查询数据,下面通过具体示例展示从单行操作到批量处理的基本用法。

16_5.3.5 读写HBase数据(配置Spark并编写程序读取HBase数据)
加载中
16_5.3.5 读写HBase数据(配置Spark并编写程序读取HBase数据)

Put写入示例:从单行到批量

单行写入是最简单的模式,先构造一个Put对象,指定行键,然后通过addColumn方法添加列族、列名和值,最后调用Table的put方法提交。

Put put = new Put(Bytes.toBytes("rowKey1"));
put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("name"), Bytes.toBytes("Alice"));
put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("age"), Bytes.toBytes("30"));
table.put(put);

当需要写入多条数据时,建议使用批量写入,将多个Put对象放入List中,调用table.put(List)即可,相比逐条写入,批量写入能大幅减少网络交互次数,提升整体吞吐量参考2

List<Put> puts = new ArrayList<>();
puts.add(new Put(Bytes.toBytes("row1")).addColumn(/.../));
puts.add(new Put(Bytes.toBytes("row2")).addColumn(/.../));
table.put(puts);

在HBase Java API写入示例中,批量操作是常规推荐做法,需要注意,如果批量中某条失败,整批是否会回滚取决于配置,通常建议将一批数据控制在合理大小,避免占用过多内存。

Get读取示例:精确查询与范围扫描

精确查询使用Get对象,指定行键即可获取整行数据,也可以指定列族和列来缩小返回量。

Get get = new Get(Bytes.toBytes("rowKey1"));
get.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("name"));
Result result = table.get(get);
byte[] value = result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("name"));

HBase数据读写示例程序如何编写,HBase存储原理是什么

范围扫描则使用Scan对象,通过设置起始行和结束行,可以获取一个区间的多行数据,Scan还支持过滤器(如PrefixFilter、FilterList)来实现更精细的过滤。参考2

Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("row1"));
scan.setStopRow(Bytes.toBytes("row3"));
ResultScanner scanner = table.getScanner(scan);
for (Result r : scanner) {
    // 处理每一行
}
scanner.close();

扫描后必须关闭ResultScanner,否则会占用RegionServer资源,这是HBase读写操作代码示例中容易忽略的细节。

HBase存储示例:批量写入与读取优化

实际生产环境中,单条读写往往无法满足性能要求,批量写入和读取优化是HBase存储示例中最常被关注的部分,直接关系到系统吞吐量。

批量写入:提升吞吐量的关键

除了上述table.put(List)方式,还可以使用BufferedMutator,它内部维护一个写缓冲区,当缓冲区满或达到一定时间后自动批量提交,适合持续写入的场景。

BufferedMutator mutator = connection.getBufferedMutator(tableName);
mutator.mutate(put);
mutator.flush(); // 手动刷出

批量写入可以显著减少RPC调用次数,据统计,当数据量较大时,批量写入的吞吐量可能是逐条写入的5倍以上(具体数值因环境而异),但也要注意,批量大小不宜过大,否则可能触发RegionServer的写压力,导致RegionTooBusyException,建议根据Row大小和网络条件调整,一般每批1000-5000条较为常见。

读取优化:合理使用Scan缓存

Scan默认每次只从服务器拉取一行,导致大量小包交互,通过setCaching()设置缓存行数,可以一次拉取多行,减少网络往返。

scan.setCaching(500); // 一次拉取500行

缓存行数越大,查询越快,但会占用更多客户端内存。

HBase数据读写示例程序如何编写,HBase存储原理是什么

行业共识认为,对于RowKey均匀分布的场景,设置1000左右的缓存是一个平衡点,使用过滤器(如SingleColumnValueFilter、PageFilter)可以在服务端提前过滤,避免传输无用数据。参考2

HBase读写操作代码示例:Java API 实战

下面是一个完整的示例,从创建表到写入数据,再到读取和删除,涵盖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;
public class HBaseDemo {
    public static void main(String[] args) throws Exception {
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "localhost:2181");
        try (Connection conn = ConnectionFactory.createConnection(conf);
             Admin admin = conn.getAdmin()) {
            TableName tableName = TableName.valueOf("test_table");
            // 创建表
            if (!admin.tableExists(tableName)) {
                TableDescriptor desc = TableDescriptorBuilder.newBuilder(tableName)
                        .setColumnFamily(ColumnFamilyDescriptorBuilder.of("cf"))
                        .build();
                admin.createTable(desc);
            }
            // 写入数据
            try (Table table = conn.getTable(tableName)) {
                Put put = new Put(Bytes.toBytes("row1"));
                put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("col1"), Bytes.toBytes("value1"));
                table.put(put);
                // 读取数据
                Get get = new Get(Bytes.toBytes("row1"));
                Result result = table.get(get);
                System.out.println(Bytes.toString(result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("col1"))));
            }
            // 删除表(可选)
            // admin.disableTable(tableName);
            // admin.deleteTable(tableName);
        }
    }
}

HBase数据读写示例程序如何编写,HBase存储原理是什么

代码中使用了try-with-resources自动关闭资源,这是推荐做法,Connection是重量级对象,应全局复用,不要每次操作都创建。

常见错误与调试

  • ZooKeeper连接失败:检查hbase.zookeeper.quorum配置是否正确,端口是否开放。
  • RegionTooBusyException:通常由写入超出RegionServer处理能力引起,可增大写缓冲区或增加Region数量。
  • Scan没有结果:检查StartRow和StopRow的设置,注意行键是字节数组,比较是字典序。
  • 表不存在异常:确认表名正确,且已经创建。

通过上述示例,你可以快速掌握HBase数据读写的基本方法,在实际项目中,结合批量操作、缓存优化和合理的表设计,能更好地发挥HBase在大数据场景下的存储优势。

HBase数据读写示例程序常见问题解答

问题1:HBase读写示例中如何连接HBase集群?

需要配置ZooKeeper地址,通过HBaseConfiguration创建Configuration对象,然后调用ConnectionFactory.createConnection获取连接,示例代码中已包含具体配置方式,注意Connection是线程安全的,应在整个应用生命周期内复用。

问题2:批量写入时出现RegionTooBusyException怎么办?

可以尝试增大写缓冲区大小(通过BufferedMutator的setWriteBufferSize),或增加客户端重试次数,如果问题持续,说明RegionServer写入压力过大,建议通过预分区或增加RegionServer实例来分摊负载。

问题3:使用Scan扫描时如何设置缓存?

通过Scan.setCaching(int)设置一次远程调用返回的行数,默认值1,建议根据行的大小和可用内存调整,通常设置100到2000之间,注意,扫描完成后需要调用ResultScanner.close()释放资源,否则可能导致RegionServer端连接泄漏。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/532630.html

(0)
html播放音乐地址怎么用?,怎么设置?
上一篇 2026年7月31日 03:34
HTTPS证书购买和管理有哪些注意事项,哪个平台便宜
下一篇 2026年7月31日 03:35

相关推荐

  • access数据库多人访问冲突怎么解决?access数据库多用户同时编辑

    Access数据库适合小团队轻量级协作,但一旦并发用户超过10人或数据量超过50MB,就必须迁移至SQL Server等关系型数据库以避免数据损坏,很多中小企业在起步阶段,为了节省成本,习惯用Access作为后台管理系统,这种选择在前几年数据少、人员少的时候确实省事,但随着业务增长,大家开始发现文件打不开、数据……

    2026年7月3日
    2100
  • 带宽按量计费还是固定带宽划算?哪种计费方式更省钱?

    带宽按量计费还是固定带宽划算?核心结论是:没有绝对的优劣,关键在于业务流量的波动特征,对于流量稳定且带宽利用率高于60%的业务,固定带宽更划算;对于流量波动剧烈、有明显波峰波谷或初创期业务,按量计费更具成本优势,在实际的企业IT架构和云资源选型中,网络带宽的成本控制是运维和财务部门共同关注的焦点,选择哪种计费模……

    2026年3月6日
    12600
  • Access默认的数据库文件夹在哪?access数据库默认路径在哪里

    Access默认的数据库文件夹路径通常位于当前用户目录下的“文档”文件夹中,具体路径为“C:\Users\用户名\Documents”或“C:\Users\用户名\My Documents”,具体位置取决于Windows版本及Office安装配置,对于许多初次接触微软Access的用户来说,这个看似简单的路径问……

    2026年7月3日
    1710
  • HTML5高端装修公司网站源码怎么改?哪里下载免费源码

    HTML5高端装修公司网站源码的核心价值在于通过语义化标签与响应式布局,实现移动端优先的极致体验,从而在2026年百度算法下获得更高的搜索权重与转化率,在数字化营销进入深水区后,传统的静态展示型网站已无法满足高端家装品牌对质感与服务深度的需求,百度SEO的逻辑早已从单纯的关键词匹配,转向对用户意图、页面体验及内……

    服务器宽带 2026年6月6日
    3800
  • html中图片模糊化怎么做?css如何实现图片高斯模糊

    在HTML中实现图片模糊化,最推荐且性能最优的方案是使用CSS的filter: blur()属性,它无需修改图片源文件即可实现前端实时渲染,兼顾了开发效率与页面加载速度,图片模糊处理在网页设计中并非仅仅为了“遮丑”,它更多被用于背景虚化、隐私保护、加载占位符以及营造视觉层次感,随着2026年Web标准对性能要求……

    服务器宽带 2026年6月6日
    4700
  • 互联网区块链数据连接标准是什么?区块链数据如何跨链互通

    互联网区块链数据连接标准的核心在于建立统一的数据交互协议与身份认证体系,从而实现跨链、跨平台的数据可信流通与价值互联,为什么我们需要统一的数据连接标准在2026年的数字生态中,区块链早已不再是孤立的账本,而是成为基础设施的一部分,不同链之间的“语言不通”依然是行业痛点,如果没有统一的标准,数据就像散落在各个岛屿……

    2026年6月2日
    4000
  • HTML多图片预加载怎么做?前端图片预加载最佳实践

    HTML多图片预加载的核心在于利用JavaScript监听图片资源或在CSS中提前引入,从而在用户实际浏览前将图片缓存至本地,彻底解决页面加载时的白屏或闪烁问题,显著提升首屏渲染速度与用户体验,在Web开发领域,图片始终是影响页面性能的关键瓶颈,随着高清屏幕和移动端流量的爆发,一张未经优化的大图往往占据数百KB……

    2026年6月7日
    3910
  • idc机房带宽哪家稳?idc机房带宽哪家稳定速度快

    在IDC服务领域,带宽稳定性直接决定业务生死,综合数百份用户真实评价与第三方监测数据,核心结论十分明确:带宽稳定性不取决于单一运营商,而取决于服务商的混合BGP调度能力与冗余架构设计,真正稳定的带宽,必须是“多线接入+智能切换+骨干网直连”的产物,而非简单的价格博弈,用户在选择时往往陷入“大厂迷信”或“低价陷阱……

    2026年3月5日
    13900
  • 广州200g高防虚拟主机租用价格多少钱?哪家性价比高?

    广州200g高防虚拟主机租用价格的核心逻辑在于“防御成本与业务安全性的平衡”,市场行情显示,具备真实防御能力的该类主机年费通常在数千元至万元区间浮动,价格差异直接反映了机房线路质量、防御机制及售后运维的专业度,企业不应仅以低价为导向,而需综合考量防御实效与服务稳定性,高防虚拟主机的价值在于保障业务连续性,而非单……

    2026年4月1日
    7200
  • 带宽按量计费还是固定带宽划算?哪种计费方式更省钱?

    对于绝大多数业务流量波动较大或处于成长期的互联网应用而言,带宽按量计费更具成本优势;而对于流量峰值极其稳定、且长期维持在高位的基础设施类业务,固定带宽才是划算的选择,决策的核心在于“带宽利用率”这一指标,当平均带宽利用率低于30%时,按量计费能节省30%-50%的成本;当利用率持续高于70%时,固定带宽则能锁定……

    2026年3月8日
    11800

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注