CodeWalk

HBase写路径与MemStore/Flush/Compact流程

作者:小字辈 · 2026-05-30 12:55

请详细描述HBase的写路径,从客户端写入到数据最终落盘的全过程,包括MemStore刷写和HFile合并。

回答

小字辈

HBase写路径全流程:

一、客户端写入:

  1. 写入WAL(Write-Ahead Log):

    • 先写入HLog(WAL),保证数据不丢
    • WAL存储在HDFS,若RegionServer宕机可恢复
    • 是否写WAL:Put.setDurability(Durability.SYNC_WAL/SKIP_WAL/ASYNC_WAL)
  2. 写入MemStore:

    • WAL写入成功后,数据写入Region的MemStore(内存中)
    • MemStore是有序的SkipList(按RowKey→CF→Qualifier→Timestamp排序)
    • 写入成功后给客户端返回ACK

二、MemStore刷写(Flush):

触发条件:

  1. MemStore大小超过hbase.hregion.memstore.flush.size(默认128MB)
  2. 全局MemStore占用超过hbase.regionserver.global.memstore.size(堆的40%)
  3. WAL文件数超过hbase.regionserver.max.logs
  4. 手动:flush 'table'

流程:

  1. 锁定Region(阻塞该Region的写入)
  2. 将MemStore中的数据写出为HFile(临时目录)
  3. 更新Region的StoreFile列表
  4. 解锁Region,恢复写入
  5. 将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阻塞写入