HBase region is not online 问题修复

本文记录了一次线上HBase遇到的数据访问异常及修复过程。通过hbck工具检测到表的一致性问题,并成功修复,最终验证数据访问恢复正常。

一年多没有搞HBase了,回想前年和营神一起战斗的日子,~~~。今天线上遇到下面一个问题:

hbase(main):002:0> get 'mynamespace:user_basic_info','BAC3510A922CF026500874EA3975E123'
COLUMN CELL 


ERROR: org.apache.hadoop.hbase.NotServingRegionException: Region mynamespace:user_basic_info,BA5968E36ADB91CE1EA37D44267F5865,1489326561674.0250284baa6119d676821e86cfaa29f4. is not online on *******,60020,1491385979553
at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegionByEncodedName(HRegionServer.java:2922)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.getRegion(RSRpcServices.java:1053)
at org.apache.hadoop.hbase.regionserver.RSRpcServices.get(RSRpcServices.java:2006)
at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:33644)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2170)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:109)
at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:133)
at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:108)
at java.lang.Thread.run(Thread.java:745)

其他region 都是正常的,重启regionserver 后依然报同样的错误。

首先检查这张表是否存储一致性问题

hbase hbck -details  table

发现的确出现了2个不一致的地方

2 inconsistencies detected.

既然不一致,咱就尝试修复一下:

hbase hbck -repair table

这个功能要管理权限,使用慎重!修复完了以后结果如下

Summary:
Table hbase:meta is okay.
    Number of regions: 1
    Deployed on:  ctum2f0602005.idc.wanda-group.net,60020,1482504754412
Table idctag:user_basic_info is okay.
    Number of regions: 124

0 inconsistencies detected.
Status: OK

测试一下是否修复:

Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release
17/04/06 11:10:15 INFO Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.0-cdh5.7.1, rUnknown, Wed Jun  1 16:27:04 PDT 2016

hbase(main):001:0> get 'mynamespace:user_basic_info','BAC3510A922CF026500874EA3975E123'
COLUMN                                     CELL                                                                                                                       
 index:chineseName_encrypt                 timestamp=1489324693470, value=950887757EDFFFDE26E9961E8998591A                                                            
 index:city                                timestamp=1489324693470, value=\xE9\x95\x87\xE6\xB1\x9F                                                                    
 index:ffan_enrollment_time                timestamp=1489324693470, value=2016-10-29 08:54:13                                                                         
 index:from_***                         timestamp=1489324693470, value=0                                                                                           
 index:from_child                          timestamp=1489324693470, value=0                                                                                           
 index:from_**                         timestamp=1489324693470, value=0                                                                                           
 index:from_**                          timestamp=1489324693470, value=1                                                                                           
 index:from_***                          timestamp=1489324693470, value=0                                                                                           
 index:from_***                      timestamp=1489324693470, value=0                                                                                           
 index:from_***                           timestamp=1489324693470, value=0                                                                                           
 index:from_theme                          timestamp=1489324693470, value=0                                                                                           
 index:from_travel                         timestamp=1489324693470, value=0                                                                                           
 index:mobile_encrypt                      timestamp=1489324693470, value=BAC3510A922CF026500874EA3975E123                                                            
 index:***                  timestamp=1489324693470, value=\xE6\xB1\x9F\xE8\x8B\x8F                                                                    
 index:***                           timestamp=1489324693470, value=\xE6\xB1\x9F\xE8\x8B\x8F                                                                    
15 row(s) in 0.3020 seconds

测试通过

如果hbase fsck 过程提示文件有损坏,可以使用hdfs 如下命名check region对应的文件

hdfs fsck /hbase/data/mynamespace/tablename/0250284baa6119d676821e86cfaa29f4/index/f142db2e1d844d48858ee2d919299ca0 -locations -blocks -files

出现的这样原因我后续会分析。

### HBase Region热点问题解决方案 HBase中的Region热点问题是常见的性能瓶颈之一,主要表现为某些Region上的读写操作过于集中,导致该Region所在的RegionServer负载过高,进而影响整个集群的性能。以下是几种有效的解决方案: #### 1. 预分区设计 在创建表时合理设置预分区可以有效避免后续因数据量增加而频繁分裂带来的性能开销以及可能引发的热点问题。通过预先定义好足够的初始Regions数目及其边界键值来均匀分配未来的数据录入位置[^3]。 ```bash create 'my_table', {NAME => 'cf', SPLITS => ['100','200','300']} ``` 以上命令会在建立`my_table`的同时依据给定的SPLITS参数生成三个起始Region,分别覆盖不同的RowKey区间。 #### 2. 使用Salted RowKeys策略 为了进一步改善数据分布不均的情况,可以在原始RowKey前面加上随机数(称为Salt),这样即使原RowKey本身存在聚集倾向也能被打散至不同Region中去存储。Salt的选择范围通常设定为小于等于当前Cluster内的RegionServers总数目以确保最佳效果[^4]。 例如对于一条记录原本其RowKey可能是`user_123456`, 加入salt之后变为 `0_user_123456`, 其中'0_'部分即是作为区分标志加入进去的小数值. #### 3. 调整Load Balancer行为模式 启用基于表格级别的负载均衡功能可以帮助实现更精细粒度的数据管理控制。具体做法是在HBase配置文件hbase-site.xml里新增一项属性:hbase.master.loadbalance.bytable=true 。这一改动使得Master节点能够单独考虑各个独立Table的需求来进行资源调度而不是笼统对待所有Tables一起处理[^3]. #### 4. 定期监控与手动干预 尽管自动化机制很重要,但是定期的人工检查仍然不可或缺。管理员应该持续关注系统状态指标比如各台服务器CPU利用率、内存消耗情况等等;当发现异常现象如某个特定Region访问频率特别高时,则可采取相应措施诸如强制迁移这个忙碌的Region到其他较为空闲的服务实例上去运行一段时间直至压力缓解为止。 ```java // Java API Example to move a region manually. Configuration config = HBaseConfiguration.create(); Admin admin = new Admin(config); admin.move(Bytes.toBytes("region_name"), Bytes.toBytes("destination_server")); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值