Hbase客户端的写缓冲区和put列表

本文详细介绍了HBase客户端的写缓冲区机制,包括如何通过API配置缓冲区的开启与关闭、设置缓冲区大小,以及缓冲区在何种条件下会自动刷新到服务器等关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写缓冲区

HBase每次的put操作,都是一次rpc操作,如果某个应用程序每秒钟有1000+的put操作,那显然是不合适的。

HBase的客户端API中配置了一个写缓冲区,缓冲区负责收集put操作,达到一定条件后,调用一次rpc操作,将全部的缓冲数据发送到服务器端。

    void setAutoFlush(boolean autoFlush)

    boolean isAutoFlush()

默认情况下,写缓冲区是关闭的,可以通过setAutoFlush(false)来打开写缓冲区。

可以通过isAutoFlush()来判断当前写缓冲区的开关状态。

如果需要强制性的将数据发送到服务器端,可以通过:

    void flushCommits() throws IOException

可以将所有缓冲的数据发送到服务器端。


每个HBase客户端默认的写缓冲区大小是2M,可以通过:

    long getWriteBufferSize()

    void setWriteBufferSize(long writeBufferSize) throws IOException

配置写缓冲区的大小。

2M的缓冲区一般比较合适,如果存储的是视频数据,例如是720P或者1080P的视频数据,那么数据的传输时间占了大部分的请求时间,所以此时缓冲区的作用就不大了(缓冲区的大小最好根据实际测试结果进行调整)。

缓冲区在两种情况下会flush到服务端:

    ①显示调用flushCommits()

    ②隐式flush

    即在客户端调用put()或者setWriteBufferSize()时,客户端会自动比较缓冲区的大小和实际数据的大小,如果超过配置的缓冲区,那么会自动调用flushCommits()。另外调用HTable的close()操作时,也会调用flushCommits()。


其实上面都是没用的,下面才是真正的东西.





put列表

    void put(List<Put> puts) throws IOException

调用基于列表的put时,客户端会先把所有的Put实例插入到本地的写缓冲区中,然后隐式的调用flushCache()。如果共有5个Put实例,会对每个Put实例进行检查,如果第3个Put检查失败,那么前两个Put会被添加到缓冲区,后两个不会,自然也不会触发写命令。

另外,用户无法控制服务器端执行put的顺序,这意味着服务器被调用的顺序 也不受用户控制。


get列表

与put列表类似,但是当get列表中出现错误,会导致整个get()操作失败。
### HBase 入数据流程 #### 定位 RegionServer Region 当客户端准备向 HBase入数据时,会先通过 `HConnection` 的 `locateRegion` 方法,在元数据表 `hbase:meta` 中根据 rowkey 找到其归属的 RegionServer[^4]。 如果是一次批量入操作,则会对多个 rowkey 进行处理并按所属 `HRegionLocation` 分组。同一分组内的记录会被打包成单个 RPC 请求发送给同一个 RegionServer;而不同分组则分别对应独立的 RPC 调用。 #### 数据预日志 (WAL) 接收到请求后,RegionServer 需要确保即使发生故障也不会丢失任何已接收的数据更新。为此,它会先把变更追加入 Write-Ahead Log (WAL),即 HLog 文件。需要注意的是,此时数据仅被入文件系统的缓存,并未立即同步至物理磁盘上[^2]。 #### MemStore 缓冲区入 紧接着,新到达的数据项将被加入内存中的 MemStore 结构里等待后续持久化。每当有新的 Put 或 Delete 命令到来时,MemStore 就负责暂存这些修改直到满足特定条件触发刷新动作为止[^3]。 #### 刷 StoreFile 随着不断累积,一旦达到配置阈值或是经过一段设定的时间间隔之后,系统便会启动 flush 操作把当前 MemStore 内容转储为一个或多个只读的 HFile 存储于本地磁盘之上。每一次这样的转换过程都会创建全新的 HFile 实例来保存最新版本的数据副本。 最终,为了提高性能表现以及减少 I/O 开销,实际落盘的动作通常发生在后台异步执行期间而非即时响应阶段。这意味着尽管应用程序可能已经收到了成功确认消息,但真正意义上的持久化工作还在继续进行当中。 ```python from hbase import HBaseClient, Mutation client = HBaseClient() table_name = 'example_table' mutations = [ Mutation(column="cf:a", value="value1"), Mutation(column="cf:b", value="value2") ] # 插入一条或多条记录 result = client.put(table=table_name, row_key='row-key', mutations=mutations) if result: print('Data inserted successfully.') else: print('Failed to insert data.') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值