HBase 的读写过程

Hbase读写流程

一、hbase的读操作:
  ZooKeeper—meta–regionserver–region–memstore–storefile
  1、首先从zookerper找到meta表的region的位置,然后读取meta表中的数据。而meta中又存储了用户表的region信息
  2、根据namespace、表名和rowkey根据meta表中的数据找到写入数据对于的region信息
  3、然后找到对于的regionserver
  4、查找对应的region
  5、先从Memstore找数据,如果没有,再到StoreFile上读
  HBase 的读写过程
二、hbase的写操作:
  ZooKeeper—meta–regionserver–1、Hlog 1、MemStore–storefile
  1、首先从zookerper找到meta表的region的位置,然后读取meta表中的数据。而meta中又存储了用户表的region信息
  2、根据namespace、表名和rowkey根据meta表中的数据找到写入数据对于的region信息
  3、然后找到对于的regionserver
  4、把数据分别写到Hlog和memstore各一份
    4、1当memstore达到阈值后把数据刷成一个storefile文件,当compact后,逐渐形成越来越大的storefile后触发spilt,
把当前的StoreFile分成两个,这里相当于把一个大的region分割成两个region
    4、1若MemStore中的数据有丢失,则可以从HLog上恢复,当多个StoreFile文件达到一定的大小后,会触发Compact合并操作,
合并为一个StoreFile,这里同时进行版本的合并和数据删除
HBase 的读写过程
下面对hbase架构进行分析

HBase 的读写过程
架构分析
1、HMaster
负责管理HBase元数据,即表的结构、表存储的Region等元信息。
负责表的创建,删除和修改(因为这些操作会导致HBase元数据的变动)。
负责为HRegionServer分配Region,分配好后也会将元数据写入相应位置(后面会详细讲述放在哪)。
如果对可用性要求较高,它需要做HA高可用(通过Zookeeper)。但是HMaster不会去处理Client端的数据读写请求,因为这样会加大其负载压力,具体的读写请求它会交给HRegionServer来做。

2、HRegionServer
一个RegionServer里有多个Region。
处理Client端的读写请求(根据从HMaster返回的元数据找到对应的Region来读写数据)。
管理Region的Split分裂、StoreFile的Compaction合并。
一个RegionServer管理着多个Region,在HBase运行期间,可以动态添加、删除HRegionServer。

3、HRegion
一个HRegion里可能有1个或多个Store。
HRegionServer维护一个HLog。
HRegion是分布式存储和负载的最小单元。
表通常被保存在多个HRegionServer的多个Region中。
因为HBase用于存储海量数据,故一张表中数据量非常之大,单机一般存不下这么大的数据,故HBase会将一张表按照行水平将大表划分为多个Region,每个Region保存表的一段连续数据。 初始只有1个Region,当一个Region增大到某个阈值后,便分割为两个。

4、Store
Store是存储落盘的最小单元,由内存中的MemStore和磁盘中的若干StoreFile组成。
一个Store里有1个或多个StoreFile和一个memStore。
每个Store存储一个列族
StoreFile合并(Compaction)
目的:减少StoreFile数量,提升数据读取效率。

Compaction分为两种:

major compaction
将Store下面所有StoreFile合并为一个StoreFile,此操作会删除其他版本的数据(不同时间戳的)

minor compaction
选取Store下的部分StoreFile,将它们合并为一个StoreFile,此操作不会删除其他版本数据。

Region分割(Split)
目的:实现数据访问的负载均衡。

做法:利用Middle Key将当前Region划分为两个等分的子Region。需要指出的是:Split会产生大量的I/O操作,Split开始前和Split完成后,HRegionServer都会通知HMaster。Split完成后,由于Region映射关系已变更,故HRegionServer会更新meta表。