HBase读数据过程
HBase 读数据流程:一条 RowKey 从客户端到磁盘,经历了什么?
HBase 里查一条数据,不是”直接去文件里找”这么简单。它要经过 ZooKeeper、元数据表、RegionServer,还要在内存、缓存、磁盘三层里搜一遍。
绕这么大一圈,是为了两个目标:
- 定位:数据在哪个 RegionServer 上?→ 靠 ZooKeeper + hbase:meta
- 读取:数据在内存还是磁盘?→ 靠 MemStore → BlockCache → StoreFile 三层查
整体流程:四步走
graph TD
A[客户端] --> B[ZooKeeper获取hbase:meta位置]
B --> C[访问hbase:meta表]
C --> D[定位目标Region及RegionServer]
D --> E[连接目标RegionServer]
E --> F{读取数据}
F -->|找到| G[MemStore]
F -->|未找到| H[BlockCache]
H -->|找到| I[返回数据]
H -->|未找到| J[读取StoreFile]
J --> K[写入BlockCache]
K --> I
1. 客户端 → ZooKeeper:问"元数据表在哪?"
2. 客户端 → 元数据表:问"我的数据在哪个 RegionServer?"
3. 客户端 → RegionServer:连上去,说"我要查这个 RowKey"
4. RegionServer → 客户端:从 MemStore/BlockCache/StoreFile 里找到数据,返回
前三步是”定位”,最后一步是”读取”。
第一步:找元数据表的位置——问 ZooKeeper
HBase 里所有表的 Region 分布信息都记录在 hbase:meta 表里。但 hbase:meta 表本身也是个表,它也存在某个 RegionServer 上。
问题来了:我怎么知道 hbase:meta 在哪?
ZooKeeper 存了这个信息。
客户端启动时,先连 ZooKeeper,找 /hbase/meta-region-server 这个节点,拿到 hbase:meta 表所在的 RegionServer 地址。
这一步的目的是:找到”目录”在哪。
第二步:查元数据表——定位目标 Region
拿到 hbase:meta 的位置后,客户端向那个 RegionServer 发请求,查 hbase:meta 表: