当前位置: 首页 > hbase, 分布式 > 正文

Hbase升级版本,导入数据抛出 RegionTooBusyException 的解决

【背景】要将Hbase 从0.94.2(hadoop-1.0.4)升级到1.0.0(hadoop-2.5.2),目前采取的方案是重新搭建一套集群,将原有的Hbase数据导出(export)再导入(import)到新的集群上,期间遇到了很多问题,走了很多弯路,最后还是成功完成升级,特此记录一下,有类似需求的可以参考一下。

Hbase导入导出方法有很多(可参考cloudera介绍):

由于本次升级涉及到跨版本问题,而且是跨越了两个版本:0.96,0.98,直接升级到了1.0.0,为防止Hbase因为版本升级带来的数据格式上的问题,首先尝试的是使用Export/Import方式。
基本步骤如下:
1.新集群的搭建Hadoop-2.5.2+Hbase-1.0.0
搭建新集群的时候还有些曲折:
(1)本来使用的是Hadoop-2.6.0+Hbase-1.0.0的组合,后来发现启动hbase的时候有些报错:

担心步子大了扯着蛋,网上有说Hadoop-2.6.0+Hbase-1.0.0这两个版本不兼容(没继续查找原因),安全起见降低了hadoop版本,换成了现在的Hadoop-2.5.2+Hbase-1.0.0组合。
(2)mvn编译hadoop的时候有些慢,不同的子项目居然傻乎乎的下载两遍tomcat。。

2.从原Hbase-0.94.2的集群上导出Hbase表
假设导出的表为TestTable
(1)尝试导出到本地硬盘:

后来发现这种方式不好,导出的parted文件为分散在不同的datanode节点上。
(2)导出到HDFS中:

3.将Hbase表导入到新的集群中
(1)首先将导出的文件copy到新集群的hdfs中
(2)创建Hbase表,指定了压缩格式为LZO

(3)import数据:

说明:跨版本的import要指定版本号,-Dhbase.import.version=0.94
命令执行后会触发一个Mapreduce,不过很快任务就失败了,失败原因是:RegionTooBusyException。

分析了一下,由于hbase的key比较集中,import的时候全部落在了一个regionserver上,大量的并发写和split操作导致region不可用,最后任务失败。

想到的解决办法是:
预分配分区(pre-sharding),这需要根据key的实际情况进行分析处理
另外是尝试进行hbase的参数调优,而这次调优的目的是要让import/MR操作不失败,尽量的产生少的Map,同时减少触发split的机会。
经过多次调整参数,最后import成功完成,没再出现 RegionTooBusyException 错误。
主要涉及的参数如下:
1.调整了Region的大小,从之前的256M改成了2G
edit hbase-site.xml

等迁移完成之后可以改成正常的大小,比如256M。

2.调整了MAP的个数
edit yarn-site.xml

通过以上调整,每个nodemanager最多能产生2个map,这样减少MAP的数量从而降低了对regionserver的压力。
具体导入过程:

hbase import

hbase import


其实表也不是很大,才60G左右,后续导入过300G的表也没有问题!

本文固定链接: https://www.sudops.com/resolve-hbase-import-regiontoobusyexception.html | 运维·速度

该日志由 Fisher 于2015年04月22日发表在 hbase, 分布式 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: Hbase升级版本,导入数据抛出 RegionTooBusyException 的解决 | 运维·速度
关键字: ,

Hbase升级版本,导入数据抛出 RegionTooBusyException 的解决:等您坐沙发呢!

发表评论


Time limit is exhausted. Please reload the CAPTCHA.

快捷键:Ctrl+Enter