文档章节

HBase集群出现NotServingRegionException问题的排查及解决方法

vieky
 vieky
发布于 2013/01/04 17:18
字数 1308
阅读 192
收藏 2

HBase集群出现NotServingRegionException问题的排查及解决方法

Posted by 原 攀峰 on 2012 年 11 月 25 日 Leave a comment Go to comments

HBase集群在读写过程中,可能由于Region Split或Region Blance等导致Region的短暂下线,此时客户端与HBase集群进行RPC操作时会抛出NotServingRegionException异 常,从而导致读写操作失败。这里根据实际项目经验,详细描述这一问题的发现及排查解决过程。

1. 发现问题

在对HBase集群进行压力测试过程中发现,当实际写入HBase和从HBase查询的量是平时的若干倍时(集群规模10~20台,每秒读写数据量在几十万条记录的量级),导致集群的读写出现一定程度的波动。具体如下:

1)写端抛出以下异常信息:

org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 150 actions: NotServingRegionException: 150 times, servers with issues: my161208.cm6:60020,at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processBatchCallback(HConnectionManager.java:1600)at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.processBatch(HConnectionManager.java:1376)at org.apache.hadoop.hbase.client.HTable.flushCommits(HTable.java:916)

2)读端也抛出类似异常信息:

org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=10, exceptions:Mon Oct 29 14:03:09 CST 2012, org.apache.hadoop.hbase.client.ScannerCallable@3740fb20, org.apache.hadoop.hbase.NotServingRegionException: org.apache.hadoop.hbase.NotServingRegionException: xxxxxx,\x0FP\x8D\xC3\xDB1053223266:\x00\x00V6,1351490475989.bd68113129f07163dc25e78fba17ad6c. is closing

以上异常,在压测期间周期性地出现,HBase集群由此出现了短暂的不可服务期。

2. 排查问题

通 过查看HBase Master运行日志,结合客户端抛出异常的时刻,发现当时HBase集群内正在进行Region的Split和不同机器之间的Region Balance,那么,为什么会周期性频繁触发以上过程呢?而且是发生在压测期间(数据量与平时相比大几倍)。下面结合表的设计来分析一下:

1) 由于表中rowkey有时间字段,因此每天都需要新创建Region,同时由于写入数据量大,进一步触发了HBase的Region Split操作,这一过程一般耗时较长(测试时从线上日志来看,平均为10秒左右,Region大小为4GB),且Region Split操作触发较为频繁;

2)同时由于Region Split操作导致Region分布不均匀,进而触发HBase自动做Region Balance操作,Region迁移过程中也会导致Region下线,这一过程耗时较长(测试时从线上日志来看,平均为20秒左右)。

3. 解决问题

首先,从客户端考虑,其实就是要保证Region下线不可服务期间,读写请求能够在集群恢复后继续,具体可以采取如下措施:

1) 对于写端,可以将未写入成功的记录,添加到一个客户端缓存中,隔一段时间后交给一个后台线程统一重新提交一次;也可以通过 setAutoFlush(flase, false)保证提交失败的记录不被抛弃,留在客户端writeBuffer中等待下次writeBuffer满了后再次尝试提交,直到提交成功为止。

2)对于读端,捕获异常后,可以采取休眠一段时间后进行重试等方式。

3)当然,还可以根据实际情况合理调整hbase.client.retries.number和hbase.client.pause配置选项。

然后,从服务端考虑,需要分别针对Region Split和Region Balance进行解决:

1) 由于建表时,我们已经考虑到了数据在不同Region Server上的均匀分布,而且预先在不同Region Server上创建并分配了相同数目的Region,那么考虑到为了集群能够在实际线上环境下提供稳定的服务,可以选择关掉HBase的Region自动 Balance功能,当然关掉后可以选择在每天读写压力小的时候(如凌晨后)触发执行一次Balance操作即可。

2)接下来,Region总是被创建,不能被复用的问题该如何解决呢?根本原因是rowkey中包含了timestamp字段,而每时每刻 timestamp总是 向上增长的。但是,使用方确实需要能够根据timestamp字段进行顺序scan操作,因此,timestamp字段必须保留。据此,这里给出两种解决 思路:

  • 一种常用方法是将表按照时间分表,例如按天进行分表,这样可以通过预先建表创建好Region分区,避免实际读写过程中频 繁触发Region Split等过程,但是这一方法的缺点是每天需要预先建好表,而这一DDL过程可能出现问题进而导致读写出现问题,同时跨天时读写端也需要做出适应,调整 为读写新创建的表。
  • 其实,我们可以换一种思路,通过修改表的rowkey结构,将timestamp字段改成一个周期循环的 timestamp,如取timestamp % TS_MODE后的值,其中TS_MODE须大于等于表的TTL时间周期,这样才能保证数据不会被覆盖掉。经过这样改造后,即可实现Region的复用, 避免Region的无限上涨。对于读写端的变更也较小,读写端操作时只需将timestamp字段取模后作为rowkey进行读写,另外,读端需要考虑能 适应scan扫描时处理[startTsMode, endTsMode]和[endTsMode, startTsMode]两种情况。

© 著作权归作者所有

vieky
粉丝 12
博文 55
码字总数 47106
作品 0
长沙
高级程序员
私信 提问
HBase in Practice - 性能、监控及问题解决

李钰(社区ID:Yu Li),阿里巴巴计算平台事业部高级技术专家,HBase开源社区PMC&committer。开源技术爱好者,主要关注分布式系统设计、大数据基础平台建设等领域。连续4年基于HBase/HDFS设计和...

中国HBase技术社区
2018/07/23
84
0
HBase解决Region Server Compact过程占用大量网络出口带宽的问题

HBase 0.92版本之后,RegionServer的Compact过程根据待合并的文件大小分为smallcompaction和large compaction两种,由此可能导致在集群写入量大的时候Compact占用过多的网络出口带宽。本文将...

超人学院
2015/05/26
224
0
HBase跨集群复制Snapshot失败排查解决

起因 在跨集群复制HBase快照时,经常会出现由于/hbase/.tmp/data/xxx FileNotFoundException导致任务失败。 现还原出错场景,并分析错误原因,给出一些常用的解决方法: 主要原因 在创建快照...

HBase技术社区
2018/08/15
0
0
HADOOP HBASE配置注意事项

1、yum安装的jdk工具1.8版本,在配置hbase1.2版本需要在hbase-env.sh配置文件中注释掉下面的内容: export HBASEMASTEROPTS="$HBASEMASTEROPTS -XX:PermSize=128m -XX:MaxPermSize=128m" exp......

断臂人
2018/07/11
0
0
兑吧:从自建HBase迁移到阿里云HBase实战经验

业务介绍 兑吧集团包含兑吧网络和推啊网络,兑吧网络是一家致力于帮助互联网企业提升运营效率的用户运营服务平台,提供积分商城和媒体运营服务。推啊网络是一家互动式广告平台,经过多年的探...

所在jason
2018/06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android MVP 快速开发框架ZBLibrary

MVP 架构,提供一套开发标准(View,Data,Event)以及模板和工具类并规范代码。封装层级少,简单高效兼容性好。 OKHttp、UIL图片加载、ZXing二维码、沉浸状态栏、下载安装、自动缓存以及各种B...

boonya
17分钟前
33
0
printf的格式很长的论点是什么?

printf函数采用参数类型,例如%d或%i用于signed int 。 但是,我没有看到任何long价值的东西。 #1楼 如果您打算像我一样打印unsigned long long ,请使用: unsigned long long n;printf("...

技术盛宴
24分钟前
46
0
为BlueLake主题增加图片放大效果

fancyBox 是一个流行的媒体展示增强组件,可以方便为网站添加图片放大、相册浏览、视频弹出层播放等效果。优点有使用简单,支持高度自定义,兼顾触屏、响应式移动端特性,总之使用体验相当好...

CREATE_17
24分钟前
23
0
如何将现有的Git存储库导入另一个?

我在名为XXX的文件夹中有一个Git存储库,还有第二个名为YYY的 Git存储库。 我想将XXX存储库作为名为ZZZ的子目录导入YYY存储库,并将所有XXX的更改历史记录添加到YYY 。 之前的文件夹结构: ...

javail
39分钟前
22
0
JSP-Servlet入门2之JSP运行原理(一)

JSP全名为Java Server Pages,中文名叫java服务器页面,是一种动态页面技术 。实际上JSP是指在HTML中嵌入java脚本语言, 一、 JSP起源 在很多动态网页中,绝大部分内容都是固定不变的,只有局...

橘子_
今天
28
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部