当前位置:技术分享 > 技术参考 > 正文

hbase Normalizer解决预分区错误,在不动数据的情况下完美解决热点问题2018-04-11 15:53:05 | 编辑:hely | 查看: | 评论:0

很多人遇到hbase已经预分区完毕,在装上数据之后,发现并不是很合理,有的分区数据多,有的数据很少。想重新划分分区。
问题导读

1.对于预分区错误,hbase使用什么功能解决?
2.Region Normalizer的功能是什么?
3.在什么情况下运行Normalizer 比较好?
4.哪个版本开始有Normalizer功能?
5.什么情况下Normalizer会合并region?
6.什么情况下Normalizer会分裂region?

很多人遇到hbase已经预分区完毕,在装上数据之后,发现并不是很合理,有的分区数据多,有的数据很少。想重新划分分区。这在以前的版本是非常的困难的,解决办法只有重新创建建表,然后重新导数据,这是非常麻烦的,特别是数据量已经非常大。hbase为了解决这个问题,增加了Normalizer这个功能.

Region Normalizer使用表的所有region大致相同大小。它通过找到一个粗略的平均值来做到这一点。大于这个平均值【size】的两倍的region将会被分割。更小的region将会合并到相邻的region。

在集群空闲的时候,或则比较大的改动后比如大量删除,适合运行Normalizer 。自HBase-1.2开始,Region Normalizer便具有功能。它运行一组预先计算的merge/split操作,以调整比table的平均region太大或太小区region。Region Normalizer为hbase所有表调用计算‘plan’。系统表(比如 hbase:meta, hbase:namespace, Phoenix 系统等)和用户表当计算‘plan’时,禁用Normalizer会被忽略。对于启用了normalization的表,normalization plan跨多个表并行执行。

可以使用HBase shell中的'normalizer_switch'命令在整个集群中全局启用或禁用Normalizer。Normalization 也可以在每一个表基础上进行控制,默认情况下创建表时禁用此操作。通过将NORMALIZATION_ENABLED表属性设置为true或false,可以启用或禁用表的Normalization。

检测normalizer状态和enable/disable normalizer

 

 

启用时,每5分钟在后台调用Normalizer(默认情况下),可以在hbase-site.xml中配置hbase.normalization.period时间。Normalizer也可以使用HBase shell的normalize命令手动/编程调用。HBase默认使用SimpleRegionNormalizer,但只要用户实现RegionNormalizer接口,用户就可以继承RegionNormalizer接口设计自己的normalizer 。有关SimpleRegionNormalizer用于计算normalization plan的逻辑的详细信息,请参阅此处(https://hbase.apache.org/devapid ... gionNormalizer.html)。截图如下

 

 

下面展示了为用户表计算的normalization plan,合并操作由SimpleRegionNormalizer采取的计算规范化计划(normalization plan )。

假如一个具有一些预分割区域的用户表,其具有3个同样大的region(大约100K行)和1个相对小的区域(大约25K行)。 以下是hbase meta表扫描的部分,显示用户表的每个预分割regions 。

 

 

在HBase shell中使用'normalize'调用标准化程序(normalizer ),HMaster日志中的以下日志片段显示按照为SimpleRegionNormalizer定义的逻辑计算的标准化计划(normalization plan)。 由于表中相邻最小区域的总区域大小(以MB为单位)小于平均区域,因此规范器计算( normalizer computes)合并这两个区域的计划。

 

 

Region normalizer按照计算计划,合并start key作为‘’,和end key为'1'的region。另外一个region,start key为‘1’,end key为‘3’,现在这两个region合并为一个新的region,start key 为‘’ 和end key 为‘3’

 

 

对于具有3个较小region和1个较大region的用户表可以看到类似的例子。 在这个例子中,我们有一个用户表,其中一个大region包含100K行,另外三个region相对较小,每个region大约有33K行。 从规范化计划中( normalization plan)可以看出,由于较大的region是平均region大小的两倍以上,所以它们分割成两个region - 一个以start key为'1',end key为'154717',另一个区域的start key为 '154717'和end key为'3'

 

上一篇:一条数据的HBase之旅,简明HBase入门教程-Write全流程 OpenStack如何在大数据用例中扮演关键角色下一篇:

公众平台

搜索"raincent"或扫描下面的二维码