# 问题描述
hbase,关机、重新启动之后,UI页面能打开,但是表都不见了。 查看master启动日志,有警告:显示元数据meta表not online。
2023-05-19 13:59:40,429 WARN [master/dqs09:16000:becomeActiveMaster] master.HMaster: hbase:meta,,1.1588230740 is NOT online; state={1588230740 state=OPEN, ts=1684475912431, server=dqs11,16020,1684466863338}; ServerCrashProcedures=true. Master startup cannot progress, in holding-pattern until region onlined.
UI页面里的表信息,system tables确实看不到meta,namespace表了
# 原因分析:
UI界面,查看procedures & locks:发现有4个procedure应该是locked了,分别是115 116 117 118
# 解决方案:
通过hbck2工具来修复。
1. 通过bypass命令,释放卡住的procedure
#hbase hbck -j <HBCK jar 包路径> -skip bypass [options] <procedure PID>
#-d 打印debug日志 -s 跳过hbase版本检测
/data01/hbase/bin/hbase --config /data01/hbase/conf hbck -j /data01/hbase-2.4.14/hbase-hbck2-1.3.0-SNAPSHOT.jar -d -s bypass 115 116 117 118
执行成功后,观察UI界面,查看procedures & locks:已经没有卡住的procedure了
2. 通过assigns命令,重新分配meta表的region。
上一步之后,会发现UI界面里system tables还是没有meta,namespace表。
查看master日志,还是同样的警告
2023-05-19 14:20:40,441 WARN [master/dqs09:16000:becomeActiveMaster] master.HMaster: hbase:meta,,1.1588230740 is NOT online; state={1588230740 state=OPEN, ts=1684475912431, server=dqs11,16020,1684466863338}; ServerCrashProcedures=false. Master startup cannot progress, in holding-pattern until region onlined.
这时,meta表执行assigns 命令,如下:
#hbase hbck -j <HBCK jar 包路径> -skip assigns [options] <regionname>
#-d 打印debug日志 -s 跳过hbase版本检测 -o,--override override ownership by another procedure
/data01/hbase/bin/hbase --config /data01/hbase/conf hbck -j /data01/hbase-2.4.14/hbase-hbck2-1.3.0-SNAPSHOT.jar -d -s assigns -o 1588230740
执行后。返回值如果是-1 表示执行失败,其他值则是Procedure 的PID,表示命令执行成功。如下,返回值119,表示成功。
3. 通过assigns命令,重新分配namespace表的region。
上一步之后,会发现UI界面里system tables还是没有meta,namespace表。
查看master日志,namespace表也出现了不在线的警告
2023-05-19 14:28:43,568 WARN [master/dqs09:16000:becomeActiveMaster] master.HMaster: hbase:namespace,,1684379932270.cf342dde35742dafa70e87cbac598011. is NOT online; state={cf342dde35742dafa70e87cbac598011 state=OPEN, ts=1684477600527, server=dqs13,16020,1684466863293}; ServerCrashProcedures=false. Master startup cannot progress, in holding-pattern until region onlined.
这时,namespace表也类似地执行assigns 命令,如下:
hbase hbck -j <HBCK jar 包路径> -skip assigns [options] <regionname>
#-d 打印debug日志 -s 跳过hbase版本检测 -o,--override override ownership by another procedure
/data01/hbase/bin/hbase --config /data01/hbase/conf hbck -j /data01/hbase-2.4.14/hbase-hbck2-1.3.0-SNAPSHOT.jar -d -s assigns -o cf342dde35742dafa70e87cbac598011
执行后。返回值如果是-1 表示执行失败,其他值则是Procedure 的PID,表示命令执行成功。如下,返回值121,表示成功。
4. 通过assigns命令,重新分配用户表的region。
上一步之后,去使用自己建的test表,做个count,发现用户表test也出现了不在线的问题。
hbase:004:0> count 'test'
org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=8, exceptions:2023-05-19T06:36:18.206Z, RpcRetryingCaller{globalStartTime=2023-05-19T06:36:16.808Z, pause=100, maxAttempts=8}, org.apache.hadoop.hbase.NotServingRegionException: org.apache.hadoop.hbase.NotServingRegionException: test,,1684379989794.7b8109ed8f9d7bbaf4560bed173ffbe7. is not online on dqs09,16020,1684475903824 at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegionByEncodedName(HRegionServer.java:3392)
这时,test表也类似地执行assigns 命令,如下:
#hbase hbck -j <HBCK jar 包路径> -skip assigns [options] <regionname>
#-d 打印debug日志 -s 跳过hbase版本检测 -o,--override override ownership by another procedure
/data01/hbase/bin/hbase --config /data01/hbase/conf hbck -j /data01/hbase-2.4.14/hbase-hbck2-1.3.0-SNAPSHOT.jar -d -s assigns -o 7b8109ed8f9d7bbaf4560bed173ffbe7
执行后。返回值如果是-1 表示执行失败,其他值则是Procedure 的PID,表示命令执行成功。
执行成功后,重新count一下,还是原来的1万条测试数据。