在HBase入库日志中发现有一个表入库失败,检查HBase服务端后发现该表的meta信息丢失了:

而HDFS上的region还在:

而HBCK工具不支持HBase2.0版本,只好自己写一个修复工具。网上可以搜到前辈们自己编写的一些工具,比如这一篇写的就比较详细 https://blog.csdn.net/xyzkenan/article/details/103476160

我们引用一下,再对个别地方略微讲解。

看一下'hbase:meta'中正常的存储结构:

列名 说明
info:state Region状态
info:sn Region Server Node,由 server和serverstartcode组成,如slave1,16020,1557998852385
info:serverstartcode Region Server启动Code,实质上就是Region Server启动的时间戳
info:server Region Server 地址和端口,如slave1:16020
info:seqnumDuringOpen 表示Region在线时长的一个二进制串
info:regioninfo Region Info,和.regioninfo内容相同

接下来就开始动手coding:

获取'hbase:mata'中的Region信息

     public Set<String> getMetaRegions(Configuration conf, String tableName) throws Exception {

         Connection conn = ConnectionFactory.createConnection(conf);
Table table = conn.getTable(TableName.valueOf(TABLE)); PrefixFilter filter = new PrefixFilter(Bytes.toBytes(tableName + ",")); Scan scan = new Scan();
scan.setFilter(filter); Set<String> metaRegions = new HashSet<>(); Iterator<Result> iterator = table.getScanner(scan).iterator();
while (iterator.hasNext()) {
Result result = iterator.next();
metaRegions.add(Bytes.toString(result.getRow()));
} conn.close(); return metaRegions;
}

读取.regioninfo中的Region信息

     public Map<String, RegionInfo> getHdfsRegions(Configuration conf, String tablePath) throws Exception {

         FileSystem fs = FileSystem.get(conf);
Path path = new Path(hdfsRootDir + "/data/default/" + tablePath + "/"); Map<String, RegionInfo> hdfsRegions = new HashMap<>(); FileStatus[] list = fs.listStatus(path);
for (FileStatus status : list) {
if (!status.isDirectory()) {
continue;
} boolean isRegion = false;
FileStatus[] regions = fs.listStatus(status.getPath());
for (FileStatus regionStatus : regions) {
if (regionStatus.toString().contains(REGION_INFO_FILE)) {
isRegion = true;
break;
}
} if (!isRegion) {
continue;
} RegionInfo hri = HRegionFileSystem.loadRegionInfoFileContent(fs, status.getPath());
hdfsRegions.put(hri.getRegionNameAsString(), hri); }
return hdfsRegions;
}

两者进行对比取差集

         Set<String> metaRegions = getMetaRegions(configuration, repairTableName);

         Map<String, RegionInfo> hdfsRegions = getHdfsRegions(configuration, repairTableName);

         Set<String> hdfsRegionNames = hdfsRegions.keySet();

         metaRegions.removeAll(hdfsRegionNames);

构造META信息并写入HBase

         ServerName[] regionServers = admin.getRegionServers().toArray(new ServerName[0]);

         int rsLength = regionServers.length;
int i = 0;
for (String regionName : hdfsRegionNames) { String sn = regionServers[i % rsLength].getServerName();
String[] snSig = sn.split(","); RegionInfo hri = hdfsRegions.get(regionName);
Put info = MetaTableAccessor.makePutFromRegionInfo(hri, EnvironmentEdgeManager.currentTime());
info.addColumn(Bytes.toBytes(FAMILY), Bytes.toBytes(SN), Bytes.toBytes(sn));
info.addColumn(Bytes.toBytes(FAMILY), Bytes.toBytes(SERVER), Bytes.toBytes(snSig[0] + ":" + snSig[1]));
info.addColumn(Bytes.toBytes(FAMILY), Bytes.toBytes(STATE), Bytes.toBytes("OPEN")); table.put(info);
i++;
}

注意这里的各个region是轮流分配给各个regionServers,具体分配可能和meta信息丢失前不同,但是没关系,一个regionServer管理多个region,映射关系可以改变的,重启HBase服务后会生效,HBase内部也会平衡每个regionServer管理的region数量,也可在hbase shell中手动触发平衡。

使用工具修复后,先验证一下是否生成了新的meta信息:

确认无误,接下来重启所有HBase服务,重启之后会自动生成'info:seqnumDuringOpen'以及'info:serverstartcode'

重启之后,验证修复好的表是否可以读写:

OK,至此基本大功告成,再把工具稍加封装,融入我的组件包内,添加到REST API里,以后再遇到这种问题,发一个POST请求,瞬间修复。

最后还引用一下前辈封装好的工具以供下载使用,https://github.com/darkphoenixs/hbase-meta-repair

自己使用时要略加修改,比如你的hbase.root.dir可能不同,此外,我的HBase服务端虽然是2.0,但是我的修复工具使用的是1.x的包,有些接口略有不同,RegionInfo对应的是HRegionInfo,此外,1.x获取RegionServer使用的是

ServerName[] regionServers = admin.getClusterStatus.getServers().toArray(new ServerName[0]);

HBase2.0 meta信息丢失的修复方法的更多相关文章

  1. scrapy meta信息丢失

    在做58同城爬二手房时,由于房产详情页内对价格进行了转码处理,所以只能从获取详情页url时同时获取该url对应房产的价格,并通过meta传递给下回调函数 现在问题是,在回调函数中找不到原函数meta信 ...

  2. Zabbix 2.2.x, 3.0.x SQL注射漏洞修复方法

    1.漏洞测试 在您的zabbix的地址后面加上如下url: jsrpc.php?type=&method=screen.get&timestamp=&pageFile=hist ...

  3. SpringCloud升级之路2020.0.x版-43.为何 SpringCloudGateway 中会有链路信息丢失

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在开始编写我们自己的日志 Filter 之前,还有一个问题我想在这里和大家分享,即在 Sp ...

  4. SpringCloud升级之路2020.0.x版-44.避免链路信息丢失做的设计(1)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们在这一节首先分析下 Spring Cloud Gateway 一些其他可能丢失链路信息 ...

  5. SpringCloud升级之路2020.0.x版-44.避免链路信息丢失做的设计(2)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们在这一节我们将继续讲解避免链路信息丢失做的设计,主要针对获取到现有 Span 之后,如 ...

  6. HBase2.0新特性解析

    作者 | 个推大数据运维工程师 行者 升级背景 个推作为专业的数据智能服务商,在业务开展过程中存在海量的数据存储与查询的需求,为此个推选用了高可靠.高性能.面向列.可伸缩的分布式数据存储系统--HBa ...

  7. MYSQL数据表损坏的原因分析和修复方法小结

    MYSQL数据表损坏的原因分析和修复方法小结 1.表损坏的原因分析 以下原因是导致mysql 表毁坏的常见原因: 1. 服务器突然断电导致数据文件损坏. 2. 强制关机,没有先关闭mysql 服务. ...

  8. mfc110.dll丢失,解决方法

    mfc110.dll下载_附文件使用方法 mfc110.dll是存放在windows系统中的一个重要dll文件,缺少它可能会造成部分软件或游戏无法正常运行.当系统提示“没有找到mfc110.dll”或 ...

  9. SQL Server服务器名称与默认实例名不一致的修复方法

    SQL Server服务器名称与默认实例名不一致的修复方法 分类: 个人累积 SQl SERVER 数据库复制2011-08-10 09:49 10157人阅读 评论(0) 收藏 举报 sql ser ...

随机推荐

  1. 四、归并排序 && 快速排序

    一.归并排序 Merge Sort 1.1.实现原理 如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了. 归并排序使 ...

  2. java关键字static用法详解

    java中有53个关键字,其中包含2个保留字,这篇文章主要介绍一下static这个关键字. static在java中算是一个比较常见的关键字,有着多种用法,因此很有必要好好地了解一番. 一.定义 st ...

  3. Centos 7 k8s Deployment新副本控制器

    一.概念 Kubernetes提供了一种更加简单的更新RC和Pod的机制,叫做Deployment.通过在Deployment中描述你所期望的集群状态,Deployment Controller会将在 ...

  4. 如何在Centos7安装swoole的PHP扩展

    1. 下载swoole源代码包 wget -c https://github.com/swoole/swoole-src/archive/v2.0.8.tar.gz 2.tar -zxvf v2.0. ...

  5. nacos基础--客户端下载

    对于nacos的作用,我在这里不在过多介绍,不知道的同学可以自行先了解,对于nacos,有官网进行介绍,对于一个初学者来说是一件非常方便的事情. 官网地址:https://nacos.io 但是在下载 ...

  6. 使用matlab进行图像处理的一些常用操作和tip

    本人还是习惯使用Python语言,有时候不得不使用matlab的时候就变得举步维艰,下面记录一下使用matlab进行图像处理的一些常用操作以及代码,方便之后查阅: 1. 图像的读取 %% 读取原图像 ...

  7. tcpdump抓包工具的基本使用

    为了更好的深入理解计算机网络等相关知识,例如TCP\UDP\IP等,我们就必须利用tcpdump.Wireshark等工具对网络进行分析.本篇博文主要记录一下tcpdump这个网络分析利器的一些基本使 ...

  8. 【JMeter_08】JMeter逻辑控制器__While控制器<While Controller>

    While控制器<While Controller> 业务逻辑: 当条件为非false时,执行该节点下的脚本内容,判断条件包括数字.null.空白.字母.符号.true. 当条件为fals ...

  9. Windows 程序设计(3) 关于字符串

    1. 宽窄字节的区别及重要性 1.1 宽窄字节简介: C语言/C++语言,使用的字符串指针就是 char* 类型,C++中的字符串是 string,内部也是对 char* 的封装 窄字节 其实最早的系 ...

  10. WeChair项目Alpha冲刺(4/10)

    团队项目进行情况 1.昨日进展    Alpha冲刺第四天 昨日进展: 前端完成小程序登录态的定义 LoginController编写初步完成同时修改并更新了代码,但是在将编码好的项目部署到服务器上时 ...