hbase数据刷写

本文详细解析了HBase中触发Flush操作的六种条件,包括MenStore内存超过阈值、RegionServer内存压力、WAL数量过多、定期自动Flush、数据更新频率高及手动触发。深入探讨了每种条件下Flush机制的运作原理及其对系统性能的影响。

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

触发flush操作的条件:

1)region中所有MenStore占用的内存超过相关阈值

当一个region中所有MenStore占用的内存大小超过刷写阈值,会触发一次刷写,hbase.hregion.memstore.flush.size 默认值为128M。我们每次调用put、delete都会去检查这个值。

如果我们的数据增加的很快,达到了 hbase.hregion.memstore.flush.size * hbase.hregion.memstore.block.multiplier 的大小,hbase.hregion.memstore.block.multiplier 默认值为4,也就是128*4=512MB的时候,除了触发MenStore的flush操作外,还会阻塞所有写入该Store的写操作。

2)RegionServer中MenStore占用内存总和大于相关阈值

hbase为RegionServer分配了一定的写内存,大小默认等于占用regionServer整个JVM内存使用量的40%(hbase_heapsize(RegionServer 占用的堆内存大小)* hbase.regionserver.global.memstore.size。)

如果整个regionServer的MenStore占用内存大于总和大于hbase.regionserver.global.memstore.size.lower.limit(默认值为0.95) * hbase.regionserver.global.memstore.size * hbase_heapsize 的时候,将会触发MenStore的Flush操作。

RegionServer级别的Flush策略是每次找到RegionServer中占用内存中最大的Region进行刷写,这个操作是循序进行的,直到总体内存的占用低于全局MenStore刷写的下限才会停止。如果达到了RegionServer级别的Flush,那么当前RegionServer的所有写操作都会被阻塞,而且这个阻塞可能会持续到分钟级别。

3)WAL数量大于相关阈值

WAL(预写日志),用来解决宕机之后的操作回复问题,数据到达Region之前,会先写入WAL,然后再写入MenStore。如果WAL的数量过大,就意味着MenStore未持久化到磁盘的数据越来越多。当RS挂掉的话,恢复时间就会变得很长。所以有必要在WAL数量到达一定阈值时,进行一次刷写。

WAL刷写策略是:找到最旧的文件,并找到这个WAL对应的regions,然后对这些regions进行刷写。

4)定期自动刷写

RegionServer启动的时候会启动一个线程PeriodicMemStoreFlusher,每隔一段时间去检查这个Regionerver的Region有没有超过一定的时间没有刷写。这个时间是由hbase.regionserver.optionalcacheflushinterval 参数控制的,默认是 3600000,也就是1小时会进行一次刷写。如果设定为0,则意味着关闭定时自动刷写。为了防止有过多的MenStore同时刷写,定期自动刷写会有0-5分钟的延迟。

5)数据更新超过一定阈值

如果某个Region更新的很频繁,既没有达到自动刷写阈值,也没有达到内存限制,但是内存中更新的数量已经很多了,比如超过 hbase.regionserver.flush.per.changes 参数配置,默认为30000000,那么也是会触发刷写的。

6)手动触发刷写

可以通过API接口或相关命令来触发MenStore的刷写,比如可以调用Admin接口提供的方法,分别对某张表、某个 Region 或者某个 RegionServer 进行刷写操作。

 

 

 

 

转载于:https://www.cnblogs.com/ww5566/p/11490354.html

### 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、付费专栏及课程。

余额充值