Hbase运维工具——Hbck2工具使用
强大的Hbase运维工具,Hbck2工具使用
1.hbase2特性
hbase2.x中,把zookeeper 中的状态取消了,region 的状态直接在master 和 regionserver 直接变化。
在hbase2.x 中几乎所有的集群操作都是通过procedure进行的,这也就意味着,产生异常的过程大部分都是在proceduer中,比如region opening 过程卡死或者closing 过程卡死,最终都会导致region 的状态有问题,即产生region in transition。
在Hbase中产生使用中,通过切换hmaster和hbck2工具结合使用,可以解决多数的rit情况。
同时,hbck2可以修复元数据,通过此特性也可以进行Hbase的数据迁移。
2.什么是procedure
hbase2.x中几乎所有的动作都变成了proceduer了,比如assign 和 unassign 过程,那每一个 procedure 本质上是由一系列的动作组成的,但最终只有两种状态,成功或者失败(ROLL BACK), 不存在中间状态,所以procedure是支持事务的。
2.1.那失败的proceduer中是怎么回滚的?
procedure执行的动作都会以log的形式持久化在HBase的MasterProcWals目录下,这样proceduer 失败后,就可以通过记录在这里的动作进行回滚,当然master在重启时也能通过日志来恢复之前的状态并且继续执行。
2.2.proceduer中的关键锁
procedure在执行过程中会拿好几把锁, 这个在处理问题时是很重要的,因为一旦锁没有释放,再做任何操作也只能是卡住等锁。
IdLock:procedure级别的锁,保证一个procedure不会被多个线程同时执行。
资源锁:对HBase的内部资源进行加锁,不同的procedure加锁的粒度不同,目前有region/table/namespace/region server级别的锁。
例如:
assign一个region,那么procedure在执行的时候就需要对这个region进行加锁,这样如果有别的人想要unassign这个region,或者drop这个region所在的table,都需要等最早的assignment结束后释放锁了才能执行。这样防止有不一致的情况出现。
如果有proceduer 卡主了,可以再hmaster页面上面的Proceduer & Locks 中看到卡主的详细过程,通过页面中信息然后对卡主的proceduer 进行后续的处理。
3.HBCK2的修复
首先要保证hbase:meta表是正常的,才能使用hbase hbck进行检查,因为后续的大多操作都是基于hbase:meta表来进行的,如果不正常先修复hbase:meta
通过查看一下元数据表是否正常可以查询来判断hbase:meta是否正常,如果打印信息正常说明正常
scan 'hbase:meta',LIMIT=>10
修复时要一张表一张表的进行修复
如果一个 Region 处于 CLOSING 状态,没有转换到CLOSED状态前,就不能被 assigned ,反之,如果它处于 OPENING 状态,那么它就不能被 unassigned。Region 状态必须总是从 CLOSED 到 OPENING 再到 OPEN 状态,然后再到 CLOSING 到 CLOSED 状态
如果表的状态为DISABLED,那么就无法分配该表的region,如果一个表的状态是DISABLED,但是该表有个Region出问题了状态时OPENING,那么就需要将该表的状态改为ENABLED,然后在对Region进行分配。
4.hbck2使用命令
hbase hbck -j <jar包地址> <命令>
hbase hbck -j /opt/hbase/hbase-hbck2/hbase-hbck2-1.3.0.jar <命令> <OPTIONs>
4.1.bypass [OPTIONS]
bypass可以将一个或多个卡住的procedure进行释放。原理很简单,在procedure的类里有一个bypass的flag, 每次执行时会检查这个flag是否为true,如果为true则直接返回null, 这样procedure就会被认为执行成功。
而bypass就是把这个procedure对象中的这个flag直接设为true。 这样stuck的procedure就不再执行,也不会继续卡在哪里,释放了锁后,那么后面才能进行修复工作。
【OPTIONS】
常用参数
-o,--overide 在执行bypass之前先会尝试去拿IdLock, 如果procedure还在运行就会超时返回null,但是设置了这个参数即使拿不到IdLock也会去将procedure的bypass flag设为true。
# 如果proceduer 有子proceduer 使用该参数
-r, --recursive 在bypass一个procedure时也会将这个procedure的所有子procedure进行递归的bypass。例如我们bypass一个对table schema修改的procedure, 就需要加上-r参数,才能把这个操作的所有子procedure都bypass掉。--有父procedure时使用
# 一般不用
-w, --lockWait 上文提到的等待IdLock的超时时间配置,默认为1ms
2)assigns [OPTIONS] <ENCODED_REGIONNAME>...
后面可以接多个region,重新执行assign 过程,返回值是创建的pid则为成功,-1则为失败。
4.2. assigns
# 常用参数
-o,--override 这里的override跟bypass的override不同,因为assign本身就会创建一个新的procedure, 所以肯定是不涉及到拿IdLock的,但是这里涉及到资源锁的问题。因为之前卡住的资源锁即使在bypass后也不会释放(用于fence, 防止更多未知的错误操作),所以需要加一个-o去手动释放这个资源锁。
-i,--inputFiles 可以在一个文件中指定一个或者多个region
# 下面的案例即可将下面的两个region 重新 assign,多用于bypass 和 region 处于other 状态时,手动上线
hbase hbck -j /opt/hbase/hbase-hbck2/hbase-hbck2-1.3.0.jar assigns a4900f31fd9e686f9b2de8c394a20aed cce4ec2af61ae6babc44bf3cc22bc240
4.3.unassigns
将一个或多个region unassign,返回值是创建的pid则为成功,-1则为失败。
# 与assigns的一致
-o,--override
4.4.setTableState
可选的table状态有ENABLED, DISABLED, DISABLING, ENABLING,在table的状态和所有的region状态不一致时可以用这个命令进行修复,使用之前建议使用:desc ‘tablename’ 查看一下当前表的状态
4.5.serverCrashProcedures
手动schedule一个或多个serverCrashProcedure, 如果有serverCrashProcedure没有执行成功,但是procedure log已经丢失了,那么可以利用这个命令进行修复。返回值为创建的pid则为成功,-1则为失败。
4.6.setRegionState <ENCODED_REGIONNAME>
手动设置region 的状态,可选的状态有OFFLINE, OPENING, OPEN, CLOSING, CLOSED, SPLITTING, SPLIT, FAILED_OPEN, FAILED_CLOSE, MERGING, MERGED, SPLITTING_NEW, MERGING_NEW, ABNORMALLY_CLOSED,返回0表示成功,1表示失败
hbase:meta表中可能的表状态和表示形式:ENABLED(\ x08 \ x00),DISABLED(\ x08 \ x01),DISABLING(\ x08 \ x02),ENABLING(\ x08 \ x03)。
注意:使用这个命令前,一定要确认这个region 不在assign 和unassign procedures 中,你可以在hbase shell 中使用命令 list_procedures 进行查看这个region 的状态
echo "list_locks"| hbase shell &> /tmp/locks.txt
echo "list_procedures"| hbase shell &> /tmp/procedures.txt
# 例如设置某个region 的状态位CLOSING
hbase hbck -j /opt/hbase/hbase-hbck2/hbase-hbck2-1.3.0.jar setRegionState de00010733901a05f5a2a3a382e27dd4 CLOSING
4.7.addFsRegionsMissingInMeta NAMESPACE|NAMESPACE:TABLENAME…
生成环境中hbase:meta会因为某些原因丢失一些region的信息,这个时候可以使用hbck2的addFsRegionsMissingInMeta 进行修复,该命令会扫描hdfs中Region目录的region_info的信息并根据该信息进行region重建,最后在运行该命令输出的assign命令进行重新分配
#An example adding missing regions for tables 'tbl_1' in the default namespace, 'tbl_2' in namespace 'n1' and for all tables from namespace 'n2':
hbase hbck -j /opt/hbase/hbase-hbck2/hbase-hbck2-1.3.0.jar addFsRegionsMissingInMeta default:tbl_1 n1:tbl_2 n2
4.8.extraRegionsInMeta NAMESPACE|NAMESPACE:TABLENAME…
生成环境中,有的时候会遇到表中的region数据已经删除,但是hbase:meta中还有该region的信息,这种情况有可能是split出问题,或者是误操作将hdfs中的region数据给rm或mv了,也有可能是丢块了等等。这个时候可以使用hbck2的extraRegionsInMeta --fix进行修复
-f, --fix fix meta by removing all extra regions found.
# An example triggering extra regions report for tables 'table_1' and 'table_2', under default namespace:
hbase hbck -j /opt/hbase/hbase-hbck2/hbase-hbck2-1.3.0.jar extraRegionsInMeta default:table_1 default:table_2
4.9.filesystem [OPTIONS] […]
生成环境中,有的时候会出现hfile 损坏,hfile引用损坏,hbase.version 丢失或者links 损坏等,这个时候可以使用–fix 进行修复。
注意–fix不会修复数据完整性问题,比如holes 和 orphan 的region.
【OPTIONS】
-f, --fix [<TABLENAME>...] 默认是修复所有表
项目git地址:
更多推荐
所有评论(0)