读流程
- hbase client 访问 zk ,得到 meta 表的数据所在的 region server 。
meta 表结构:
rowkey :【table, regionstart key ,regionid】
info:regioninfo
info:regionserver
- 从region server (meta 表的region server)读到元数据并缓存在 client。
这也是为什么 Connection 是重量级开销的原因,元数据可能也有个几M或者几十M。
- 从 meta 表 info 列族中获取到具体存储当前要读取表信息的 region server。
- 给 region server 发送读取请求。
- 首先将该操作记录到 region server 的 WAL 日志。
- 读取 block cache ,缓存命中,直接返回,否则继续。
- 读取 mem store 内存与 store 文件。
可能存在数据写入但是没有落盘,所以需要读取 mem store。
读取 store HFlie 文件, HFile 文件存储的信息,可以快速判断当前 HFile 文件是否变化,以及布隆过滤器,可以判断要读取的 key 是否存在。
- 将读到的数据合并返回 client。
HBase 写入流程
- Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server。
- 访问对应的 Region Server,获取 hbase:meta 表,根据读请求的 namespace:table/rowkey, 查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以 及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。
与目标 Region Server 进行通讯; - 将数据顺序写入(追加)到 WAL;
WAL 日志是记录在 hdfs 上的,一个 region server 公用一个 WAL 文件,并不是一个 region 一个文件。
- 将数据写入对应的 MemStore,数据会在 MemStore 进行排序;
- 向客户端发送 ack;
- 等达到 MemStore 的刷写时机后,将数据刷写到 HFile。
思考
- 写入mem store 后什么时候刷盘,刷盘时机(在刷盘的时候,产生小文件会怎么办)
- hfile 文件的合并与拆分