分享

Hbase 分区问题

aqi915 发表于 2015-5-10 19:30:43 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 13 47286
desehawk 发表于 2018-4-9 18:05:24
heheidiot 发表于 2018-4-9 17:10
我也好想知道这个问题呀

如果已经创建好,数据已经填充。这个在修改分区,基本不可能了。重新建表,然后将旧表数据导入。
当然你也可以尝试下面方法:
1.修改hbase.hregion.max.filesize的大小,然后采用负载均衡
2.增多预分区,也就是创建表后,在采用预分区的方式,看能否创建成功。
这是个人想出来的办法。如果不死心,可以试试。


回复

使用道具 举报

desehawk 发表于 2018-4-9 18:08:14
下面文章可参考

hbase大规模数据写入的优化历程
业务背景:由于需要将ngix日志过滤出来的1亿+条用户行为记录存入Hbase数据库,以此根据一定的条件来提供近实时查询,比如根据用户id及一定的时间段等条件来过滤符合要求的若干行为记录,满足这一场景的技术包括:Solr,Elasticsearch,hbase等,在此选用了Hbase来实践。

step 1 hbase建表后直接写入 :

直接hbase建表,然后读取记录文件逐条写入Hbase。由于hbase实际的写入速度远远小于我的提交速度,在写入了1700条记录后,hbase出现了宕机,提交后无响应。查看hbase日志,出现 out of memory异常。

step 2 hbase预分区/优化hbase配置:

考虑在建表的时候没有进行预分区,因此写入的时候会存在热点写的问题,同时数据持续增长,需要不断的对region进行split,实际上这一步相当消耗资源。因此对要写入的Hbase表重新预分区。好在上一步骤中写入的数据不多,因此直接删除表和数据后重新建表并预分区:
create 'user_actions', {NAME =>'info', VERSIONS=>3},{SPLITS =>['130','140','160','170','180']}


设计预分区的时候需要有个预判,rowkey的范围及在各个区间的可能分布情况,由于我这里的rowkey是组合用户的注册电话/时间及其他字段,因此上述的预分区,可以将记录较好的散列在各个region上,对热点写有一定的减缓作用。同时,针对out of memory异常,修改hbase配置文件/conf/hbase-site.xml,将hbase的堆内存增加到3GB(条件有限,如果硬件条件好的话,可以增加到4-8GB)。继续写入,但是写入速度很慢,维持在数百条/秒的样子,同时写入了20几万条后响应速度越来越慢。

step 3 批量写入hbase:
上述问题的根源在于高频提交小数据,导致Hbase疲于创建线程并进行资源的回收,最终甚至会出现宕机。之后,将单条put到Hbase改为一次put多条记录到hbase,即批量提交,同时限制一秒内提交的频次。最后顺利写入。由于hbase集群只有三台机器(一台master,2台slave),进过上述优化后,写入速度基本维持在1w-2w条/秒的水平,基本满足需要了。

总结:在hbase涉及一次性写入大量数据时,有几个地方可以考虑进行优化:
(1)建表的同时进行预分区
(2)修改Hbase本身的配置(能够优化写入和读取的配置项远不止修改堆内存这一项,在此不表了)
(3)尽量使用批量写入的方法,同样的道理,读取的时候,使用批量读的方法
(4)网络IO/磁盘IO
回复

使用道具 举报

pig2 发表于 2018-4-9 19:19:44
本帖最后由 pig2 于 2018-4-9 22:20 编辑
heheidiot 发表于 2018-4-9 17:10
我也好想知道这个问题呀

HBase-1.2版本以后,增加功能Normalizer,可以通过编程或则hbase shell的方式,合并小的region。
shell的方式如下
[mw_shl_code=bash,true]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[/mw_shl_code]
官网地址http://hbase.apache.org/book.html#arch.overview
相关api



https://hbase.apache.org/devapid ... gionNormalizer.html


更多内容推荐参考
hbase Normalizer解决预分区错误,在不动数据的情况下完美解决1
http://www.aboutyun.com/forum.php?mod=viewthread&tid=24292




回复

使用道具 举报

javaanddonet 发表于 2018-4-28 11:10:29
desehawk 发表于 2018-4-9 18:08
下面文章可参考

hbase大规模数据写入的优化历程

你好,我有一个疑问,我记得HBase有一种backload的方式可以将数据批量加载到HBase表中。为何不用这种方式呢?
回复

使用道具 举报

12
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条