gengwx00 2020-04-29
1. 查看日志,找到出错位置。
源码位置:hbase-0.94.11\src\main\java\org\apache\hadoop\hbase\master\AssignmentManager.java 1879
可以看到,问题是由于把某个region进行transit过程中出现了错。
造成的原因很可能就是重新设置了ttl造成数据块中造成了部分损坏。
2. 既然数据块损坏,那么重启后mater为什么会起不来直接abort,从上面代码可以看到这属于源码的一个Bug,按理说数据块损坏,不应该影响mater的正常启动。
3. 因此调研了0.94.27版本,可以看到对此处进行了优化。
在此版本中,当region在transition过程中出现了错误,但并不会影响master的正常启动。
4. 由于数据存储在hdfs中,hbase对于hdfs来说就是一个客户端,我们可以放心对hbase0.94.11备份,用0.94.27替换。
5. 替换后,用hbase自带的工具 hbfc 修复,可以看到损坏的region。
6. 通过hdfs界面,找到损坏的region对应的数据块,直接删除损坏的数据块。
7. 删除损坏的数据块后,再进行hbase的hbfc修复。
8. master成功启动。且可正常运行。
9. 由于删除hdfs的损坏数据块时,使用的hdfs自带的工具,在删除的同时也会删除namenode对应的元数据。
10. 但是hbase并不知道你删除了坏数据对应的region,因此你需要对hbase的.META.表进行修复,去掉损坏的region元数据,否则当有人访问此元数据对应的region会出错。
总结完毕