第一节 参考
https://github.com/apache/hbase-operator-tools.git
https://yq.aliyun.com/articles/686248
https://yq.aliyun.com/articles/586755?utm_content=m_48695
http://hbase.apache.org/book.html#arch.bulk.load.complete.strays
https://blog.csdn.net/opensure/article/details/47054861
第二节 入口
org.apache.hbase.HBCK2.main->org.apache.hbase.HBCK2#run
第三节 修复meta fixMeta
进入org.apache.hadoop.hbase.client.HBaseHbck#fixMeta.
发rpc请求到server端.
第四节 修复文件系统 filesystem
入口org.apache.hbase.FileSystemFsck#fsck.
1.创建HBaseFsck对象.
2.调用hbck1.HBaseFsck#createHFileCorruptionChecker()创建文件损坏检查器.
3.从命令行参数中获取表名.
4.调用hbck1.HFileCorruptionChecker#checkTables()检查表的相关目录.
(1).遍历表的目录中的文件.
(2).每一个目录创建一个RegionDirChecker.
(3).添加表的MobRegionDirChecker.
(4).多线程调用每个checker做检查.
(5).每个checker线程都进入hbck1.HFileCorruptionChecker#checkRegionDir()方法,在region目录
中检查列族.
第五节 修复meta表 addFsRegionsMissingInMeta
一.调用HBCK2#reportTablesWithMissingRegionsInMeta()查看.regionInfo文件有但是meta表没有的region信息.
1.创建FsRegionsMetaRecoverer对象,调用FsRegionsMetaRecoverer#reportTablesMissingRegions查看丢失region.
2.调用FsRegionsMetaRecoverer#findMissingRegionsInMETA.获取丢失region.
(1).调用FsRegionsMetaRecoverer#getTableRegionsDirs.根据rootDir根目录hdfs://192.168.1.192:9000/hbase和表名DATA_CENTER:DEV_GPS_TEST的生成表的hdfs路径为hdfs://192.168.1.192:9000/hbase/data/DATA_CENTER/DEV_GPS_TEST.遍历这个表名下的region名,取出region路径.
(2).调用hbase.MetaTableAccessor#getTableRegions()取出region.进入hbase.MetaTableAccessor#getTableRegionsAndLocations().进入hbase.MetaTableAccessor#scanMeta()扫描meta表,获取一条region记录.根据记录创建RegionInfo对象.
(3).遍历hdfs中的region文件目录,如果meta表里面获取的region名称不包含文件目录的名称则,添加到丢失region的list中.
二.调用HBCK2#addMissingRegionsInMeta添加丢失的region.
进入FsRegionsMetaRecoverer#putRegionInfoFromHdfsInMeta.
1.调用HRegionFileSystem#loadRegionInfoFileContent从hdfs的.regionInfo文件中加载region内容.调用ProtobufUtil#toRegionInfo()反序列化为RegionInfo对象.protocof文件为HBaseProtos#HBaseProtos.RegionInfo#parseDelimitedFrom().
2.调用hbase.MetaTableAccessor#addRegionsToMeta()把regionInfo的记录添加到meta表中.添加region的ClOSED状态.
第六节 分配region assigns
发RPC请求给服务端.请求接口为MasterProtos.AssignsResponse assigns(RpcController var1, MasterProtos.AssignsRequest var2);
最后一节 附录
一.1.x版本工具说明
在线hbck修复:
前提:HDFS fsck 确保 hbase跟目录下文件没有损坏丢失,如果有,则先进行corrupt block 移除。
步骤1. hbase hbck 检查输出所以ERROR信息,每个ERROR都会说明错误信息。
步骤2. hbase hbck -fixTableOrphones 先修复tableinfo缺失问题,根据内存cache或者hdfs table 目录结构,重新生成tableinfo文件。
步骤3. hbase hbck -fixHdfsOrphones 修复regioninfo缺失问题,根据region目录下的hfile重新生成regioninfo文件
步骤4. hbase hbck -fixHdfsOverlaps 修复region重叠问题,merge重叠的region为一个region目录,并从新生成一个regioninfo
步骤5. hbase hbck -fixHdfsHoles 修复region缺失,利用缺失的rowkey范围边界,生成新的region目录以及regioninfo填补这个空洞。
步骤6. hbase hbck -fixMeta 修复meta表信息,利用regioninfo信息,重新生成对应meta row填写到meta表中,并为其填写默认的分配regionserver
步骤7. hbase hbck -fixAssignment 把这些offline的region触发上线,当region开始重新open 上线的时候,会被重新分配到真实的RegionServer上 , 并更新meta表上对应的行信息。
离线OfflineMetaRepair重建:
前提:HDFS fsck 确保 hbase跟目录下文件没有损坏丢失,如果有,则先进行corrupt block 移除
步骤1: 执行 hbase org.apache.hadoop.hbase.util.hbck.OfflineMetaRepair -fix
二.2.x版本工具说明
1.addFsRegionsMissingInMeta 从hdfs的regioninfo文件中拿到region信息,恢复到meta表中.
./bin/hbase hbck -j hbase-hbck2-1.1.0-SNAPSHOT.jar addFsRegionsMissingInMeta DATA_CENTER:DEV_GPS_TEST
2.assigns 分配region。即meta表中没有info:server单元格,默认使用addFsRegionsMissingInMeta后没有这个单元格.参考版本1.x的步骤7.
./bin/hbase hbck -j hbase-hbck2-1.1.0-SNAPSHOT.jar assigns 1588230740 164d6be7a679bf3d40a309a6484fce91
3.bypass 绕过或者放弃资源加锁
4.filesystem --fix 修复hdfs的文件损坏,坏连接,坏引用,展示损坏文件。但是不修复空洞,丢失问题.
5.fixMeta 修复meta表问题,2.2.1/2.1.6及以上版本可以用.主要用来修复region空洞,region重叠,空的region文件问题.
6.replication修复集群问题.
7.reportMissingRegionsInMeta.展示hdfs文件中有,但是meta表没有的region信息.
8.setRegionState 修改region状态
9.setTableState 修改表状态
10.scheduleRecoveries 调度ServerCrashProcedure ?
11.unassigns unassign region.
三.hbck chore 和 'Adopting' Stray Data. 修复孤岛数据(丢失数据)
hbck2只能检测到region数据缺失问题,修复需要用completebulkload工具.completebulkload把hdfs文件中的数据导入hbase的表中,而不是sql 的upsert的方式,深度更快.格式如下:
${HBASE_HOME}/bin/hbase --config ~/hbase-conf completebulkload hdfs://server.example.org:9000/eb3352fb5c9c9a05feeb2caba101e1cc TestTable