为什么hbase里没有表会显示表已经存在_Hbase 架构

55cabc04f669c24a5b2e0cb6dab99046.png

前言

在介绍 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)

以下几点值得注意:

  • 当一个 region 正在分裂的时候,会产生另外两列,分别是 info:splitA 和 info:splitB,当 region 完成分裂之后,这两列就会被删除。
  • HRegionInfo 是用来表示 table 的开始和结束。如果一个 region 有一个 empty start key 则表示它是这个表的第一个 region;如果一个 region 同时有 start key 和 end key 则表示这张表只有一个 region。
  • 启动的时候,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 )。

我们来看下图:

e6872dcdd43dcfc737bc2295eda41126.png

详细过程:

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

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

参考

http://archive.cloudera.com/cdh5/cdh/5/hbase/book.html#_architecture​archive.cloudera.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值