Hbase架构

前言

在介绍hbase主要的角色HMaster和Regionserver的时候,我们先来看看元数据表hbase:meta。在0.96之前,元数据表是分成-ROOT-和.META.两张表的,0.96之后统一变成hbase:meta了。我们主要介绍一下hbase:meta。

hbase:meta

hbase:meta是一张保存了所有region信息的储存在zookeeper里面的表。表结构如下:

  • Key
    Region key of the format ([table],[region start key],[region id])

  • Values
    info:regioninfo (serialized HRegionInfo instance for this region)
    info:server (server:port of the RegionServer containing this region)
    info:serverstartcode (start-time of the RegionServer process containing this region)

以下几点值得注意:

  1. 当一个region正在分裂的时候,会产生另外两列,分别是info:splitA和info:splitB,当region完成分裂之后,这两列就会被删除。
  2. HRegionInfo是用来表示table的开始和结束。如果一个region有一个empty start key则表示它是这个表的第一个region;如果一个region同时有start key和end key则表示这张表只有一个region。
  3. 启动的时候,hbase会先去zookeeper查找hbase:meta这张表,然后更新表信息。具体是master启动AssignmentManager,AM在meta表里查找region信息(如果RegionServer(RS)健在,那么region分配位置继续保持;如果RS不在了,LoadBalancerFactory会被启动重新分配region到新的RS)。然后meta表会更新两个信息,一个是region新的分配位置,另一个是这个RS开始处理这个region的时间。

HMaster

HMaster负责监控集群里面所有的RS实例和更新meta表。通常运行在NameNode节点上。
HMaster周期性运行以下两种线程:

  • LoadBalancer:用来平衡集群内的Region
  • CatalogJanitor:检查和清理meta表

RegionServer

RS负责管理Regions。通常运行在DataNode节点上。
RS主要运行以下几种线程:

  • CompactSplitThread:检查split和管理compactions
  • MajorCompactionChecker:检查主要的compactions
  • MemStoreFlusher:周期性将MemStore写入StoreFiles
  • LogRoller:周期性检查RS的write ahead log

Region分裂过程

RS负责客户端的写操作,将数据先写进内存的一个对象memstore。一旦memstore满了,随即就会将内容写到磁盘的storefiles,这个过程叫memstore flush。一旦storefiles多起来了,RS便会将它们合并到一起形成更大的storefiles,这个过程叫compact。这个过程不断重复,region会越来越大。这时候,RS就会根据策略判断是否需要将region分裂(split)。
我们来看下图:

详细过程:

  1. RS一旦决定要将region进行分裂,那么分裂过程就开始了。RS会申请一个共享读锁来防止表的修改,然后在zk的/hbase/region-in-transition/region-name目录下面创建一个znode,状态是SPLITTING
  2. HMaster通过监控znode(region-in-transition)立马就知道这个过程开始了
  3. RS在HDFS里面的region目录下新建一个.splits子目录
  4. RS通过更改本地的数据层次将这个即将被分裂的region标记为offline。这是如果有客户端对这个region进行请求将会收到NotServingRegionException,客户端将会尝试其他region
  5. RS在.split这个目录里面创建两个子目录分别给daughter region A&B,同时创建必要的数据结构,然后开始分裂那些storefiles。总的来说,这时候每个storefile都会有两个reference file被创建,这些refernce file分别根据分裂的位置(split key ponit)指向父region的不同位置
  6. RS在HDFS目录里面创建新的region目录并将reference files移动到每一个新的region目录下
  7. RS请求更改meta表,信息具体如图。
  8. RS并行地启用daughter A&B
  9. RS将新的ABregion加到meta表并设置状态为online
  10. RS更新znode(/hbase/region-in-transition/region-name)状态为SPLIT。然后master便可以通过zk知道这个分裂过程已经完成

  11. 这时候references依然存在,但是当有新数据写入触发compact过程的时候,这些references将会被移除。Master的垃圾回收机制会周期性去检查这些新的region是否仍然有指向父region(reference files),如果没有,父region将会被移除。

以上所描述的是大致的过程,具体详细的实现建议直接阅读hbase的源码。

参考

http://archive.cloudera.com/cdh5/cdh/5/hbase/book.html#_architecture

您的支持将鼓励我继续创作!
0%