HBase 2.X版本的元数据修复及一种数据迁移方式

举报
Lettle whale 发表于 2020/10/19 11:19:15 2020/10/19
1.3w+ 7 1
【摘要】 分享一个HBase集群恢复的方法

背景

HBase 1.x中,经常会遇到元数据不一致的情况,这个时候使用HBCK的命令,可以快速修复元数据,让集群恢复正常。

另外HBase数据迁移时,大家经常使用到一种迁移方式是:拷贝HBase的数据目录/hbase/data/default到新的集群,然后在新集群执行HBCK的命令让元数据重建,这种拷贝数据目录然后恢复元数据的方式是一种快速直接的手段。

HBase升级到2.X版本之后,hbase hbck中的一些修复命令已经不再支持,包括,所以在HBase遇到集群故障,无法通过HBCK快速把元数据修复,通过HBase数据目录迁移的方式也就使用不了。

HBase 2.X的客户端执行hbase hbck时,常用的fixMeta命令已经不再支持。

hck-1无法使用

HBase 2.X版本加强了可靠性,因为使用了 procedure,由于之前的hbck(hbck-1)是会直接去向region server或者hdfs发送请求进行修复,而在HBase 2.0版本上集群内部操作全部都被挪到了procedure v2(下文都称为procedure)上进行处理。

因为所有的命令都是经过master来协调处理,所以在修复时也需要通过master进行修复。否则反而可能导致更严重的不一致问题。所以hbck-1HBase 2.x版本是不适用的。

HBase2.X版本中元数据的恢复方法

1.  修改配置hbase.assignment.skip.empty.regions=false

如果是普通的hbase:meta系统表中的元数据不正确,在修改完此参数重启HBase后就已经能恢复

当第一步骤完成后还不能修复,就要使用下面的命令了

例如启动后发现,hbase shelllist出数据,但是表无法put或者scan,这时候hbase:meta表里的t1表记录其实是不正确的

2.  hbase org.apache.hadoop.hbase.util.hbck.OfflineMetaRepair -fix

这个命令需要停止HBase然后执行。

当表的数据目录存在(/hbase/data/default/<table>),而在hbase:meta表中元数据不正确时,需要HBase停止后,执行这个meta表修复命令,

执行完成后,启动HBase

启动完成后,查看hbase:meta表的用户表记录,可以看到t1表的元数据都生成了。

3.  此时用户表就恢复了,如果还存在region空洞fixHdfsHoles或者fixHdfsOverlaps问题,可以使用hbck1中的["-fixHdfsHoles -fixHdfsOrphans -fixHdfsOverlaps -fixReferenceFiles"]

在华为云EI内核团队的hbase2中,已经将这4个命令重新集成进hbck-1中,便于维护。

新集群清理及数据迁移

看完上面的元数据恢复,应该就知道接下来的这种HBase数据迁移方式的原理:通过拷贝数据目录,让HBase元数据与业务数据目录重新建立关系,达到业务正常读写。

下面例子只考虑用户使用default命名空间

1.  拷贝旧集群的HBase数据目录到新集群,将旧集群的/hbase/data/default目录拷贝到了hdfs上的/mydata/目录;

2.  如果新集群数据不需要清理,则跳过此步骤

停止HBase

清除HBase在数据存储目录,hdfs dfs -rm -r /hbase

清除HBasezk的节点,使用ZK客户端工具zkCli.sh –server <ZK NODE>:2181  进入后执行deleteall /hbase

启动HBase,让目录结构自动生成

3.  保持HBase集群停止状态,拷贝旧机器数据目录到新集群HBase的数据目录中;

hdfs dfs -cp /mydata/default/* /hbase/data/default/ 

4.  执行hbase修复命令hbase org.apache.hadoop.hbase.util.hbck.OfflineMetaRepair –fix 

5.  设置hbase.assignment.skip.empty.regions=false并启动HBase

运行完上述步骤,在新的集群就能对迁移过来的HBase进行业务访问了。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(7

抱歉,系统识别当前为高风险访问,暂不支持该操作
  • 作者头像

    Lettle whale2020/10/19 03:21:391楼举报回复

    关于HBCK2的使用,可以参考https://www.codercto.com/a/46889.html

    1.如果一个表在删除或者启动的时候长时间处于某个状态,可以指定他的TableState

    可能的table状态, ENABLED, DISABLED, DISABLING, ENABLING
    setTableState <TABLE> <STATE>
    hbase hbck -j /opt/client/HBase/hbase/tools/hbase-hbck2-2.1.1.jar setTableState t1 DISABLED
  • 作者头像

    Lettle whale2020/10/19 03:23:052楼举报回复

    2. namespace表的region或者其他表region不能上线的时候

    根据日志获取到region名字

    hbase:namespace,,1596438601098.7e7719d84ad7f8628a97f63077d6a1a2. is NOT online; state={7e7719d84ad7f8628a97f63077d6a1a2 state=OPEN, ts=1596597167884, server=node-ana-corevmba0002,16020,1596438906484}; ServerCrashProcedures=false. Master startup cannot progress, in holding-pattern until region onlined.

    执行下面的hbck2命令可以恢复

    hbase hbck -j /opt/client/HBase/hbase/tools/hbase-hbck2-2.1.1.jar unassigns -o 7e7719d84ad7f8628a97f63077d6a1a2 
    hbase hbck -j /opt/client/HBase/hbase/tools/hbase-hbck2-2.1.1.jar assigns -o 7e7719d84ad7f8628a97f63077d6a1a2 

    如果上面hbck2命令不能执行,可以通过手工修改meta表的方式来做,将他修改为closed

    1)echo "scan 'hbase:meta'" | hbase shell | grep namespace (meta表上线的情况下)
    2)在hbase shell里修改namespace region状态为CLOSED
    put 'hbase:meta','hbase:namespace,,1596186888290.f4cdd3699b35ca2b74de6ef48f8f0696.','info:state','CLOSED' (以实际的rowkey为准)
    3)等待一分多钟(可tail -f hbase-ommxxxx.log | grep namespace 观察)
  • 作者头像

    Lettle whale2020/10/19 03:24:023楼举报回复

    3, 修复meta

    hbase:meta,,1.1588230740 is NOT online; state={1588230740 state=OPEN, ts=1596597099982, server=node-ana-corevmba0001,16020,1596438910099}; ServerCrashProcedures=false. Master startup cannot progress, in holding-pattern until region onlined. | org.apache.hadoop.hbase.master.HMaster.isRegionOnline(HMaster.java:1168)

    meta表迟迟不能上线的时候,有两种手段

    1.使用hbck2, 这里meta表的reigon名是日志中的1588230740 

    hbase hbck -j /opt/client/HBase/hbase/tools/hbase-hbck2-2.1.1.jar unassigns -o 1588230740
    hbase hbck -j /opt/client/HBase/hbase/tools/hbase-hbck2-2.1.1.jar assigns -o 1588230740

    2.第二种方法是,删除zk上的meta-server节点 /hbase/meta-region-server,然后重启hmaster
  • 作者头像

    Lettle whale2021/01/10 07:33:384楼举报回复

    设置HBase只读:
    alter '表名', METHOD => 'table_att', READONLY => 'true'

    alter '表名', METHOD => 'table_att', READONLY => 'false'
  • 作者头像

    yd_2580015262023/04/14 08:05:545楼举报回复

    新集群数据迁移后,在list中可以看到迁移的表,但是count和scan还是提示unknown table
  • 作者头像

    yd_2580015262023/04/14 08:07:156楼举报回复

    设置hbase.assignment.skip.empty.regions=false,这个设置也没有找到在哪里配置,请问在什么地方?
  • 展开更多评论

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。