HBase 2.X版本的元数据修复及一种数据迁移方式
【摘要】 分享一个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-1在HBase 2.x版本是不适用的。
HBase2.X版本中元数据的恢复方法
1. 修改配置hbase.assignment.skip.empty.regions=false
如果是普通的hbase:meta系统表中的元数据不正确,在修改完此参数重启HBase后就已经能恢复
当第一步骤完成后还不能修复,就要使用下面的命令了
例如启动后发现,hbase shell能list出数据,但是表无法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
清除HBase在zk的节点,使用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
- 点赞
- 收藏
- 关注作者
作者其他文章
Lettle whale2020/10/19 03:21:391楼编辑删除举报
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楼编辑删除举报
根据日志获取到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楼编辑删除举报
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楼编辑删除举报
alter '表名', METHOD => 'table_att', READONLY => 'true'
alter '表名', METHOD => 'table_att', READONLY => 'false'
yd_2580015262023/04/14 08:05:545楼编辑删除举报
yd_2580015262023/04/14 08:07:156楼编辑删除举报
yd_2580015262023/04/14 08:59:547楼编辑删除举报
java.lang.NullPointerException