专栏名称: About云
about云-为热爱云开发技术人员提供最全面的信息传播和服务平台
目录
相关文章推荐
51好读  ›  专栏  ›  About云

hbase Normalizer解决预分区错误,在不动数据的情况下完美解决热点问题

About云  · 公众号  ·  · 2018-04-10 15:56

正文

问题导读

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


转载注明本文链接
http://www.aboutyun.com/forum.php?mod=viewthread&tid=24292

about云论坛很多会员,遇到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

[Bash shell] 纯文本查看 复制代码

?

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
hbase(main):001:0> normalizer_enabled
true
0 row(s) in 0.4870 seconds
hbase(main):002:0> normalizer_switch false
true
0 row(s) in 0.0640 seconds
hbase(main):003:0> normalizer_enabled
false
0 row(s) in 0.0120 seconds
hbase(main):004:0> normalizer_switch true
false
0 row(s) in 0.0200 seconds
hbase(main):005:0> normalizer_enabled
true
0 row(s) in 0.0090 seconds


启用时,每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 。

[Bash shell] 纯文本查看 复制代码

?

1
2
3
4
5
6
7
8
9
table_p8ddpd6q5z,,1469494305548.68b9892220865cb6048 column=info:regioninfo, timestamp=1469494306375, value={ENCODED => 68b9892220865cb604809c950d1adf48, NAME => 'table_p8ddpd6q5z,,1469494305548.68b989222 09c950d1adf48.   0865cb604809c950d1adf48.' , STARTKEY => '' , ENDKEY => '1' }
....
table_p8ddpd6q5z,1,1469494317178.867b77333bdc75a028 column=info:regioninfo, timestamp=1469494317848, value={ENCODED => 867b77333bdc75a028bb4c5e4b235f48, NAME => 'table_p8ddpd6q5z,1,1469494317178.867b7733 bb4c5e4b235f48.  3bdc75a028bb4c5e4b235f48.' , STARTKEY => '1' , ENDKEY => '3' }
....
table_p8ddpd6q5z,3,1469494328323.98f019a753425e7977 column=info:regioninfo, timestamp=1469494328486, value={ENCODED => 98f019a753425e7977ab8636e32deeeb, NAME => 'table_p8ddpd6q5z,3,1469494328323.98f019a7 ab8636e32deeeb.  53425e7977ab8636e32deeeb.' , STARTKEY => '3' , ENDKEY => '7' }
....
table_p8ddpd6q5z,7,1469494339662.94c64e748979ecbb16 column=info:regioninfo, timestamp=1469494339859, value={ENCODED => 94c64e748979ecbb166f6cc6550e25c6, NAME => 'table_p8ddpd6q5z,7,1469494339662.94c64e74 6f6cc6550e25c6.   8979ecbb166f6cc6550e25c6.' , STARTKEY => '7' , ENDKEY => '8' }
....
table_p8ddpd6q5z,8,1469494339662.6d2b3f5fd1595ab8e7 column=info:regioninfo, timestamp=1469494339859, value={ENCODED => 6d2b3f5fd1595ab8e7c031876057b1ee, NAME => 'table_p8ddpd6q5z,8,1469494339662.6d2b3f5f c031876057b1ee.   d1595ab8e7c031876057b1ee.' , STARTKEY => '8' , ENDKEY => '' }



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

[Bash shell] 纯文本查看 复制代码

?

01
02
03
04
05
06
07
08
09
10
11
2016-07-26 07:08:26,928 DEBUG [B.fifo.QRpcServer.handler=20,queue=2,port=20000] master.HMaster: Skipping normalization for table: hbase:namespace, as it 's either system table or doesn' t have auto
normalization turned on
2016-07-26 07:08:26,928 DEBUG [B.fifo.QRpcServer.handler=20,queue=2,port=20000] master.HMaster: Skipping normalization for table: hbase:backup, as it 's either system table or doesn' t have auto normalization turned on
2016-07-26 07:08:26,928 DEBUG [B.fifo.QRpcServer.handler=20,queue=2,port=20000] master.HMaster: Skipping normalization for table: hbase:meta, as it 's either system table or doesn' t have auto normalization turned on
2016-07-26 07:08:26,928 DEBUG [B.fifo.QRpcServer.handler=20,queue=2,port=20000] master.HMaster: Skipping normalization for table: table_h2osxu3wat, as it 's either system table or doesn' t have autonormalization turned on
2016-07-26 07:08:26,928 DEBUG [B.fifo.QRpcServer.handler=20,queue=2,port=20000] normalizer.SimpleRegionNormalizer: Computing normalization plan for table: table_p8ddpd6q5z, number of regions: 5






请到「今天看啥」查看全文