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://test.idctop.com/article/532630.html

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

相关推荐

  • SSL证书私钥密码是什么?如何设置SSL证书私钥密码

    SSL证书私钥密码并非证书本身自带的固定字符串,而是你在生成密钥对(CSR)时由你自己设置的保护私钥文件的口令,其核心作用是防止私钥文件泄露后被他人恶意使用,从而保障网站通信安全,很多站长在部署HTTPS时,常把“私钥密码”和“证书密码”混淆,私钥密码是守护你数字资产最后一道防线的钥匙,如果没有这道锁,一旦存放……

    2026年6月21日
    1600
  • 宝塔Linux面板免费版和专业版有什么区别?企业版适合个人站长吗

    宝塔Linux面板免费版满足个人开发者基础运维需求,专业版侧重中小企业的高可用与安全加固,企业版则面向大型集群与私有化部署的极致管控,三者核心差异在于授权范围、安全深度及技术支持层级,在服务器运维领域,宝塔面板早已成为国内站长和运维工程师的首选工具,面对市场上琳琅满目的版本,许多用户常在“免费够用”与“付费省心……

    2026年6月21日
    2400
  • 番禺网站推广GEO设置有哪些技巧?,怎么做

    要做好番禺网站推广,必须将SEO设置作为根基,从关键词研究到网站结构优化,每一步都决定着你能否在本地搜索中拿到流量,番禺网站推广如何做SEO设置?核心步骤拆解SEO设置不是一次性动作,而是一套持续优化的流程,针对番禺本地市场,你需要从三个层面入手,第一步:锁定番禺本地化的关键词矩阵关键词是流量的入口,先问自己……

    2026年8月2日
    100
  • host查询某域名ip怎么查?如何查询域名对应的IP地址

    使用host查询某域名IP的核心答案是:在命令行输入host 域名即可直接获取该域名对应的IPv4或IPv6地址,这是排查DNS解析问题最基础且高效的手段,当网站访问出现异常,或者你想知道某个服务器背后的真实IP地址时,很多人第一反应是去搜索引擎输入域名,虽然这能查到一些缓存信息,但往往不够准确或实时,真正专业……

    2026年6月11日
    3800
  • html5音频api怎么用?html5音频api接口详解

    HTML5 Audio API 并非简单的播放控件,而是浏览器提供的底层音频处理引擎,它能让你通过 JavaScript 精确控制音频的生成、分析与实时效果处理,是构建专业级 Web 音频应用的唯一标准方案,在 2026 年的 Web 开发环境中,传统的 <audio> 标签早已无法满足复杂交互需求……

    2026年6月7日
    4300
  • 广州专业人脸识别门禁监控线报价,人脸识别门禁监控线多少钱一米

    广州市场人脸识别门禁监控线的采购成本受线材材质、传输距离、抗干扰能力及施工难度多重因素影响,综合报价通常在每米2.5元至15元不等,核心结论是:单纯追求低价往往会导致后期监控系统频繁故障、人脸识别数据传输丢包,选择具备强抗干扰能力的专用线缆并配合专业施工,才是降低全生命周期成本的最优解, 简米科技在实际工程案例……

    2026年3月29日
    12100
  • 大带宽服务器国际带宽CN2优化效果好吗?如何选择稳定低延迟的国际线路

    大带宽服务器国际带宽CN2优化并非单纯增加带宽数值,而是通过调整路由策略、优化TCP参数及选择优质节点,实现低延迟、高稳定性的跨国数据传输,从而显著提升海外业务访问体验,在2026年的全球数字化布局中,网络质量直接决定了业务的生死存亡,许多企业在出海初期,往往陷入“带宽越大越好”的误区,结果发现虽然峰值速率达标……

    2026年6月16日
    2700
  • 如何快速删除Access数据库重复记录?access数据库重复记录删除器

    Access数据库重复记录删除器并非单一软件,而是指利用Access内置查询或VBA代码来识别并清理冗余数据的技术方案,核心在于通过SQL语句或唯一索引强制去重,而非依赖第三方付费工具,在处理企业级或部门级数据时,Access因其轻量级和易上手的特点,常被用于中小型业务系统,随着数据录入量的增加,重复记录成为常……

    2026年7月1日
    1900
  • CentOS 8如何无缝迁移到Rocky Linux 8.4?CentOS 8停止维护后最佳替代方案

    CentOS 8迁移到Rocky Linux 8.4的核心结论是:利用官方提供的迁移工具leapp进行自动化升级,配合手动检查关键配置,可实现业务中断最小化的平滑过渡,无需重新格式化硬盘或重装系统,随着CentOS 8在2021年底正式停止维护,大量企业服务器面临安全补丁断供的风险,许多运维人员正在寻找稳定的替……

    2026年6月20日
    3000
  • html如何连接mysql数据库?php连接mysql数据库代码

    HTML本身无法直接连接MySQL数据库,必须借助后端语言(如PHP、Python或Node.js)作为中间层进行交互,这是Web开发的基础架构常识,很多初学者常陷入一个误区,认为可以直接在前端页面里写SQL语句去查库,这种想法在2026年的安全标准下不仅行不通,而且极度危险,浏览器运行的是JavaScript……

    2026年6月3日
    2700

发表回复

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