HBase写路径与MemStore/Flush/Compact流程
请详细描述HBase的写路径,从客户端写入到数据最终落盘的全过程,包括MemStore刷写和HFile合并。
回答
小字辈
HBase写路径全流程:
一、客户端写入:
-
写入WAL(Write-Ahead Log):
- 先写入HLog(WAL),保证数据不丢
- WAL存储在HDFS,若RegionServer宕机可恢复
- 是否写WAL:
Put.setDurability(Durability.SYNC_WAL/SKIP_WAL/ASYNC_WAL)
-
写入MemStore:
- WAL写入成功后,数据写入Region的MemStore(内存中)
- MemStore是有序的SkipList(按RowKey→CF→Qualifier→Timestamp排序)
- 写入成功后给客户端返回ACK
二、MemStore刷写(Flush):
触发条件:
- MemStore大小超过
hbase.hregion.memstore.flush.size(默认128MB) - 全局MemStore占用超过
hbase.regionserver.global.memstore.size(堆的40%) - WAL文件数超过
hbase.regionserver.max.logs - 手动:
flush 'table'
流程:
- 锁定Region(阻塞该Region的写入)
- 将MemStore中的数据写出为HFile(临时目录)
- 更新Region的StoreFile列表
- 解锁Region,恢复写入
- 将Flush完成的HFile移动到正式数据目录
三、HFile合并(Compaction):
Minor Compaction:
- 合并多个小HFile为稍大的HFile
- 减少文件数
- 不清理删除/过期数据
Major Compaction:
- 合并Store下所有HFile为一个
- 清理:已删除数据(DeleteMarker)、TTL过期数据、超过版本数的数据
- 代价较大(IO/CPU),推荐业务低峰期执行
四、整条链路图:
Client→[WAL(HDFS)]→[MemStore(内存SkipList)]→Flush→[HFile(HDFS)]→Compaction→[合并后的HFile]
五、性能调优参数:
hbase.hregion.memstore.flush.size=256MB # 减小刷写频率
hbase.hregion.memstore.block.multiplier=4 # 达到默认4倍时阻塞写入
hbase.hstore.compactionThreshold=3 # 3个文件触发Minor
hbase.hstore.blockingStoreFiles=16 # 文件数超16阻塞写入