问题描述:
正式环境 hbase集群与多个中间件集群共用5台服务器导致这5台服务器整体资源使用紧张,内存、磁盘I/O一直处于上限附近,由于hbase节点挂掉后处理不得当,导致 存在HDFS上的数据块损坏,清理HDFS上的数据导致Hbase Region上的数据出现不一致,重启hbase集群后一直报错如下图:
解决方案:
提示:这里填写该问题的具体解决方案:
例如:新建一个 Message
对象,并将读取到的数据存入 Message
,然后 mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();
换成 mHandler.sendMessage()
。
1、首先我们删除 hbase:meta 中的region元信息,该表已经不再在了,元信息也是没有用的垃圾数据。
上图框中的内容就是存在 meta表中的rowkey,直接去删除就可以。
注:不会出现数据丢失的情况大家可以放心删除
2、进入hbase sehll 删除meta表数据
hbase(main):001:0> deleteall 'hbase:meta','VIDEO_INFO_TABLE,f4bb69af5388ac3e1021e3c3614a7e21,1669339812795.134ea5559fe0b7705bda43b2db0419b2.'
Took 0.9522 seconds
hbase(main):002:0> deleteall 'hbase:meta','BLBL_VIDEO_COMMENT_TABLE,t_bilibili_2534107324,1670848768880.a928438d66bfc2f4396893a9835ad663.'
Took 0.0168 seconds
3、停止hbase集群中master服务
4、删除/hbase/MasterProcWALs 下的所有文件。
注:不删除该文件,master重启后会读取该日志文件,报错无法消除 ,正式环境在删除前请先备份。本人通过hdfs图形化管理直接下载备份到了本地,在删除重启后并无发现数据丢失,还请放心执行
hdfs dfs -rm /hbase/MasterProcWALs/*
若不删除该日志文件,重启master服务,会发现RIT还是存在,但是state变成了OFFLINE,server 变成 null
5、重启Hbase
发现已经没有RIT问题了,并且Hbase上出问题的相关表也消失了。
6、进入hbase sehll 平衡节点,balance_switch false 关闭平衡命令,balance_switch true 打开平衡命令,集群一般建议打开平衡。
hbase(main):004:0> balancer
true
Took 159.5604 seconds
关闭平衡会提示如下,遇到这种情况我们执行 balance_switch true 打开平衡就解决了。
注:
当RIT发生的时候,是执行不了 balance 的,所以RIT的状况要及时解决。
正常使用情况下的RIT问题基本不需要处理,这种RIT问题出现的频率不会很高,删除元数据需谨慎,最好在测试环境测试后,再在生产环境使用。