本文系转载,如有侵权,请联系我:likui0913@gmail.com
Region 是表格可用性和分布的基本元素,由列族(Column Family)构成的 Store 组成。对象的层次结构如下:
- Table
- Region
- Store (由每个 Region 中的列族组成的存储块)
- MemStore (每个 Region 中存储在内存中的 Store)
- StoreFile (每个 Region 中被持久化后的 Store)
- Block (StoreFile 内被分块存储后的块)
其中 StoreFile 在 HDFS 中的存储路径为:
/hbase
/data
/<Namespace> (Namespaces in the cluster)
/<Table> (Tables in the cluster)
/<Region> (Regions for the table)
/<ColumnFamily> (ColumnFamilies for the Region for the table)
/<StoreFile> (StoreFiles for the ColumnFamily for the Regions for the table)
通常而言,HBase 被设计成每台服务器运行一个数量较小的(20 - 200)但大小相对较大(5 - 20 GB)的 Region。那么为什么应该保持 Region 数量较低?
以下是保持较低 Region 数量的一些原因:
每个 MemStore 需要 2MB 的 MSLAB(MemStore-local 分配的 buffer)- 相当于每个 Region 的每个列族(ClounmFamily)需要 2MB 的 MSLAB。那么 1000 个有 2 个列族的 Region 将使用 2MB * 1000 * 2 = 4000MB ~= 3.9GB 的堆内存,甚至都还没有开始存储数据。注:MSLAB 的大小是可配置的,默认为 2MB.
举个实例来说:目前的一个集群单台 RegionServer 分配的内存大小为 32GB,其中所有的 MemStore 的最大大小比例设置为 0.4,即最大大小为 32GB * 0.4 = 12.8GB
Master 很讨厌太多的 Region,因为这可能需要大量的时间分配并批量移动。
在比较旧版本的 HBase(HFile v2, 0.90 之前的版本)中,几个 RegionServer 上的大量的 Region 会导致存储文件索引上升,增加堆使用量,并可能在 RS 导致内存压力或 OOME。
请参考Determining region count and size配置 Region 数量。
当 HBase 启动 RegionServer 分配时,简要过程如下:
当 RegionServer 失败时:
ZooKeeper session timeout + split time + assignment/replay time
Region 可以被负载平衡器(LoadBalancer)定期的移动。
HBase 维持每个 Region 的状态,并将它们的状态保存在 hbase:meat 表中,hbase:meta 的 Region 状态则保存在 Zookeeper 中。在 Master Web UI 中可以查看转换中的 Region 状态。以下是可能的 Region 状态列表:
状态转换图如下:
图示说明:
Master将Region从OFFLINE
转换成OPENING
状态,并尝试将该区域分配给RegionServer。RegionServer可能收到也可能未收到开放Region的请求。Master会重试将打开Region请求发送RegionServer,直到RPC通过或Master用完重试。在RegionServer收到打开Region请求后,RegionServer开始打开Region;
如果Master重试超时,则即使RegionServer正在打开Region,Master也会通过将Region转换为CLOSING
状态并尝试关闭它来阻止RegionServer继续打开该Region;
RegionServer打开该Region后,它将继续尝试通知Master,直到Master将该Region转换为OPEN
状态并通知RegionServer,该Region才算打开;
如果RegionServer无法打开Region,它会通知Master。然后Master将该Region转换为CLOSED
状态,并尝试在其它的RegionServer上打开该Region;
如果Master无法打开某个Region,则会将Region转换为FAILED_OPEN
状态,并且在管理员使用HBase shell操作之前或服务器死亡之前不会采取进一步的操作;
Master将Region从OPEN
转换为CLOSING
状态。持有Region的RegionServer可能已经或可能未收到关闭Region请求。Maater将重试向服务器发送关闭请求,直到RPC通过或Master用尽重试;
如果RegionServer不在线或引发NotServingRegionException,则Master将该Region转换为OFFLINE
状态,并将其重新分配给其它的RegionServer;
如果RegionServer处于联机状态,但在Master用完重试之后无法访问,则Master会将该Region移至FAILED_CLOSE
状态,并且不会采取进一步的操作,直到操作员从HBase shell进行干预或服务器死亡;
如果RegionServer获得关闭Region请求,它会关闭该Region并通知Master。Master将该Reguib移至CLOSED状态并重新分配给其它的RegionServer;
在分配Region之前,如果Region处于CLOSED
状态,Master会自动将Region转换为OFFLINE
状态;
当一个RegionServer即将分裂(split)一个Region时,它通知Master,Master将Region从OPEN
转换为SPLITTING
状态,并将要创建的两个新Region添加到RegionServer。这两个Region最初处于SPLITTING_NEW
状态。
在通知Master后,RegionServer开始分裂Region。一旦经过了不返回的地方,RegionServer会再次通知Master,以便Master可以更新hbase:meta表。不管怎样,在服务器通知分裂完成之前,Master不会更新Region的状态。如果分裂成功,则分裂的Region从SPLITTING
转换为SPLIT
状态,并且两个新的Region从SPLITTING_NEW
转换为OPEN
状态。
如果分裂失败,则分裂Region将从SPLITTING
回到OPEN
状态,并且创建的两个新的Region将从SPLITTING_NEW
转换为OFFLINE
状态;
当一个RegionServer即将合并(merge)两个Region时,它首先通知Master,Master将两个待合并的Region从OPEN
转换为MERGING
状态,并将拥有两个合并的Region内容的新的Region添加到并添加到RegionServer。新的Region最初处于MERGING_NEW
状态。
通知Master后,RegionServer开始合并这两个Region。一旦经过不返回的地方,RegionServer再次通知Master,以便Master可以更新META表。但是,Master不会更新Region状态,直到RegionServer通知合并已完成。如果合并成功,则两个合并的 Region将从MERGING
状态变为MERGED
状态,并且新的 Region 将从MERGING_NEW
转换为OPEN
状态;
如果合并失败,则将两个合并的Region从MERGING
更改回OPEN
状态,并且创建的用于容纳合并Region内容的新的Region将从MERGING_NEW
转换为OFFLINE
状态。
对于处于FAILED_OPEN
或FAILED_CLOSE
状态的Region,Master在通过HBase Shell重新分配它们时尝试再次关闭它们。
了解Region的状态变化过程十分重要,因为Region的状态在发生更改时,如果发生异常,很可能需要管理员人工介入。而在人工介入之前,很有可能会影响到部分表的正常使用,示例可参见:(HBase 部分表无法写入数据的异常处理)[https://blog.csdn.net/t894690230/article/details/78508862]
原文:https://www.cnblogs.com/likui360/p/10621322.html