HBase 的读写流程

HBase 建表由Master处理

  一、建表的请求是通过RPC的方式由Client发送到Master。(建表时应该定义合理的Schema,设置合理的Region数量 —— 预分区,通过预先创建一些空的Region,这样当数据写入HBase时,会按照Region分区情况,在集群内做数据的负载均衡,加快批量写入速度。)
  二、Master侧接收到Client侧的建表请求以后,一些主要操作包括:
    1、 生成每一个Region的描述信息对象HRegionInfo,这些描述信息包括:Region ID, Region名称,Key范围,表名称等信息。
    2、 生成每一个Region在HDFS中的文件目录。
    3、将HRegionInfo信息写入到记录元数据的hbase:meta表(存储了所有用户HRegion的位置信息,存储在ZooKeepe)中。
  三、新创建的Regions由Region AssignmentManager负责分配到各个RegionServer,具体的分配计划是由LoadBalancer来提供的。

HBase 数据写入流程

  1) 客户端访问 ZooKeeper,从 Meta 表得到写入数据对应的 Region 信息和相应 的Region 服务器。
  2) 客户端访问相应的 Region 服务器,把数据分别写入 HLog(WAL) 和 MemStore。MemStore 数据容量有限,当达到一个阈值后,则把数据写入磁盘文件 StoreFile 中,在 HLog 文件中写入一个标记,表示 MemStore 缓存中的数据已被写入 StoreFile 中。如果 MemStore 中的数据丢失,则可以从 HLog 上恢复。
  3) 当多个 StoreFile 文件达到阈值后,会触发 Store.compact() 将多个 StoreFile 文件合并为一个 大文件。
HBase 的读写流程

HBase 数据读取流程

  1) 客户端访问zookeeper获取meta表(主要记录表的元信息),然后从meta表中获取想要操作的region位置,并将meta缓存在客户端,用于后续的操作(避免每次读写都要去访问ZooKeeper或者meta Region,当一个RegionServer宕机后,客户端需要重新获取meta信息进行缓存)
  2) 客户端向对应RegionServer建立连接并发送读取数据的请求,Region接收请求后,先从 MemStore 查找数据,如果查不到就会到BlockCache中查,如果再查不到,就会到磁盘中 StoreFile 上读取,然后将数据返回给客户端。
HBase 的读写流程