关于Hbase hbck 工具网上有很多大佬已经很详细的介绍关于它的获取构建和运行方式.
今天我就结合最近项目中遇到的一些实际的问题来介绍一下在什么问题下怎样使用这个工具去解决!
- 构建和运行 hbck2
HBCK2继承自 hbck1,hbck1是 hbase -1.0版本开始附带的修复工具。hbck1不建议运行在 hbase-2.0版本以上的集群 ,它可能会造成一些严重的问题,需使用HBCK2代替 hbck1对 hbase-2.0以上集群进行修复。虽然hbck1仍然捆绑在 hbase-2.0以上的集群中 ,为了尽量减少意外hbck1已被弃用,将在hbase-3.0中删除。hbck1的修复功能 ( -fix) 已被删除,但可以报告 hbase-2.x 集群的状态;hbck1不了解 hbase-2.x 集群内部工作原理,评估的不是很准确。
HBCK2每次运行时都会执行一个独立的任务,但并不影响HBCK2分析正在运行的集群,然后像hbck1那样修复所有问题。HBCK2是用来修复的正在运行的集群中的不一致或堵塞Region。可以查看正在运行的集群 Master 的日志和Web UI,一旦发现问题就可以使用HBCK2工具进行修复或跳过不良状态。必须在HBase Master节点上进行修复,而不是在修复工具的本地进行修复,这是HBCK2和hbck1的另一个重要区别。
HBCK2已经被剥离出HBase成为了一个单独的项目,如果你想要使用这个工具,需要根据自己HBase的版本,编译源码。其GitHub地址为:https://github.com/apache/hbase-operator-tools.git在hbase-operator-tools/pom.xml中将hbase版本换成当前HBase版本,项目根目录下运行打包命令:mvn clean install -DskipTests。打包完成后,是有多个jar包的,将自己需要的hbck2取出来hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.0.0-SNAPSHOT.jar。/etc/hbase-conf是hbase部署的配置所在目录。HBCK2的jar在~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.0.0-SNAPSHOT.jar。上述命令没有传递任何选项或参数将输出HBCK2命令的帮助文档:
usage: HBCK2 [OPTIONS] COMMAND <ARGS>
Options:
-d,--debug run with debug output
-h,--help output this help message
-p,--hbase.zookeeper.property.clientPort <arg> port of hbase ensemble
-q,--hbase.zookeeper.quorum <arg> hbase ensemble
-s,--skip skip hbase version check
(PleaseHoldException)
-v,--version this hbck2 version
-z,--zookeeper.znode.parent <arg> parent znode of hbase
ensemble
- HBCK2核心功能介绍
2.1 HBCK2的修复原则
2.2 HBCK2命令
hbase hbck -j < jar包地址> <命令>
hbase hbck -j /opt/software/hbase/hbase-hbck2/ hbase-hbck2-1.1.0.jar <命令> <OPTIONs>
2.2.1 场景及使用
addFsRegionMissingInMeta
使用说明:
执行命令后,会先去查看.regionInfo文件有但是meta表没有的region信息,然后从hdfs的.regionInfo文件中加载这部分region内容。
生成环境中hbase:meta会因为某些原因丢失一些region的信息,这个时候可以使用hbck2的addFsRegionsMissingInMeta 进行修复,该命令会扫描hdfs中Region目录的region_info的信息并根据该信息进行region重建,最后在运行该命令输出的assign命令进行重新分配。
注意事项:
- 在我们使用的HBase2.1.0-cdh6.3.2(≤2.3.0)使用该命令时不会将meta表中新增Region的记录写入HBase Master AMv2中的cache,因此在挂在之前需要滚动重启HBase的Master。
extraRegionsInMeta
使用原理:
执行命令后,会读取meta表中的Region信息,与对应HBase在HDFS上的数据目录进行对比,找出meta表中存在但HDFS上不存在的Region。生成环境中,有的时候会遇到表中的region数据已经删除,但是hbase:meta中还有该region的信息,这种情况有可能是split出问题,或者是误操作将hdfs中的region数据给rm或mv了,也有可能是丢块了等等。这个时候可以使用hbck2的extraRegionsInMeta --fix进行修复。
OPTIONS:
- -f, --fix fix meta by removing all extra regions found.
注意事项:
1.在决定是否传入-f参数时,应当检查多余的Region是否存在region overlap,若存在,可以传入-f以删除meta表多余的Region信息,若不存在,应当调用assigns命令,创建一个新的Region目录写入HDFS。
- ≤1.1.0的hbase-operator-tool版本的修复工具在info:regioninfo为空时使用该命令会失效。
fixMeta
使用说明:
对 hbase:meta 中的错误或不一致状态进行服务端修复,在 hbase 2.2.1/2.1.6 或更新版本中可用。Master UI 具有匹配的新 'HBCK Report' 选项页,可保存由最近运行的 catalogjanitor和新的 'HBCK Chore' 生成的报告。在进行任何其他修复之前,首先使 hbase:meta 保持健康是至关重要的。修复 'holes'、'overlaps' 等时,在 HDFS 中创建(空)region 目录以匹配添加到 hbase:meta 的 region。命令与类似名字的旧 hbck1 命令不同。针对上次 catalog_janitor 和 hbck chore 运行生成的报告工作,如果没有什么要解决的,运行就是一个 noop。 否则 'HBCK Report' UI 报告问题,运行 fixMeta 将清除 hbase:meta 问题。
注意事项:
- 对于HBase2.1.X,在HBase版本号≥2.1.6时才能使用,对于HBase2.2.X,在HBase版本号≥2.2.1时才可使用,也就是说基于CDH6.3.2的采集2.0的HBase是不支持此命令的。
reportMissingRegionsInMeta
使用说明:
执行命令后会去查看.regionInfo文件有但是meta表没有的region信息。
在 hbase:meta 中缺少 region 并仍然存在于 HDFS 目录下时使用。这是一个仅用于 CHECK 的方法,设计用于报告目标并且不执行任何修复,提供了查看哪些 region(如果有)将被重新添加到 hbase:meta,按相应的 table/namespace 分组。想有效地在元数据表中重新添加 region,请运行'addFsRegionsMissingInMeta'。此命令需要 hbase:meta 在线, 对于作为参数指定的每个namespace/table 它执行 hbase:meta 中 可用 region 与 HDFS 上现有 region 目录之间的比对, 没有匹配项的 region 目录在其相应表名下分组打印; 没有缺失 region 的表将显示 "No mismatching regions" 消息。如果未指定 namespace 或 table,它将验证所有现有 region, 它接受多个 namespace 和 table 的组合, 即使对于默认命名空间中的表也应该包含命名空间,否则它将假定一个命名空间值。
注意事项:
- 这只是一个用于检查Region的命令,需要往meta表中添加记录的话要使用addFsRegionMissingInMeta。
assigns
使用说明:
向Master发送请求,由Master来分配Region。后面可以接多个region,重新执行assign 过程,返回值是创建的pid则为成功,-1则为失败。
OPTIONS:
-o,--override 这里的override跟bypass的override不同,因为assign本身就会创建一个新的procedure, 所以肯定是不涉及到拿IdLock的,但是这里涉及到资源锁的问题。因为之前卡住的资源锁即使在bypass后也不会释放(用于fence, 防止更多未知的错误操作),所以需要加一个-o去手动释放这个资源锁。
-i,--inputFiles 可以在一个文件中指定一个或者多个region。
注意事项:
- 该命令在HBase Master处于初始化阶段就可以使用,当hbase:meta表所在Region迟迟不分配上线时可以用命令手动指定上线。
unassigns
使用说明:
向Master发送请求,由Master来将Region从HBase节点上解除分配。将一个或多个region unassign,返回值是创建的pid则为成功,-1则为失败。
OPTIONS:
1.-o,--override 与assigns一致。
注意事项:
- 该命令在HBase Master处于初始化阶段就可以使用。
setRegionState
使用说明:
执行命令后,会从Meta表获取该region状态信息,并将新状态写进去。
手动设置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)。
注意事项:
1.使用这个命令前,一定要确认这个region 不在assign 和unassign procedures 中,你可以在hbase shell 中使用命令 list_procedures 进行查看这个region 的状态。
- 该命令在HBase2.1.0-cdh6.3.2里仅更新meta表中的Region信息,不会更新Master中缓存的Region状态信息,需要重启Master。
bypass
使用原理:
bypass可以将一个或多个卡住的procedure进行释放。原理很简单,在procedure的类里有一个bypass的flag, 每次执行时会检查这个flag是否为true,如果为true则直接返回null, 这样procedure就会被认为执行成功。而bypass就是把这个procedure对象中的这个flag直接设为true。 这样stuck的procedure就不再执行,也不会继续卡在哪里,释放了锁后,那么后面才能进行修复工作。返回值为true则是成功,false是失败。
OPTIONS:
-o,--overide 在执行bypass之前先会尝试去拿IdLock, 如果procedure还在运行就会超时返回null,但是设置了这个参数即使拿不到IdLock也会去将procedure的bypass flag设为true。
-r, --recursive 在bypass一个procedure时也会将这个procedure的所有子procedure进行递归的bypass。例如我们bypass一个对table schema修改的procedure, 就需要加上-r参数,才能把这个操作的所有子procedure都bypass掉。--有父procedure时使用
-w, --lockWait 上文提到的等待IdLock的超时时间配置,默认为1ms 一般不用。
注意事项:
- 该命令会使处于RIT状态的Region停留在中间状态,需要人工干预后执行后续修复过程。
scheduleRecoveries
使用说明:
向HBase Master发送ScheduleServerCrashProcedureRequest,执行ServerCrashProcedure,以处理RegionServer宕机后的处理工作,包含WAL切分,RegionServer上的Region分配与挂载等操作。
注意事项:
- 该命令的意义是完成RegionServer宕机后的处理工作,不是让已经宕机的RegionServer复原。
replication
使用说明:
检查表复制队列中应清除但未清除的存储信息,若传入-f会删除这些信息并删除meta表中的ReplicationBarrier。
setTableState
使用说明:
执行命令后,修改hbase:meta表中表示数据表状态的table:state数据列的值并更新Master中缓存的数据表状态。可选的table状态有ENABLED, DISABLED, DISABLING, ENABLING,在table的状态和所有的region状态不一致时可以用这个命令进行修复,使用之前建议使用:desc 'tablename' 查看一下当前表的状态。
注意事项:
- 该命令不会修复HBase的文件系统完整性问题(比如出现overlap、Orphans或Hole)。
generateMissingTableDescriptorFile
使用说明:
执行命令后先检查TableDescriptor是否缓存在hmaster中,如果是,则直接通过缓存生成,如果不在,则通过表名、列族(表目录确定)、默认配置和列族描述符。
修复表tableinfo,类似hbck1的fixTableOrphan.如果表目录直接丢失,则不能正常修复。
注意事项:
- 当数据表对应文件目录缺失或.tableinfo存在时,该命令不会生效
filesystem
使用说明:
执行完命令后会调用fsck进行文件修复。生成环境中,有的时候会出现hfile 损坏,hfile引用损坏,hbase.version 丢失或者links 损坏等,这个时候可以使用--fix 进行修复。
OPTIONS:
- -f, --fix [<TABLENAME>...] 默认是修复所有表。
注意事项:
- --fix不会修复数据完整性问题,比如holes 和 orphan 的region。
MissingRegionDirsRepairTool
使用说明:
获取hbase:meta表中不存在但是在HBase数据文件目录中存在的Region目录,将数据文件移至临时目录并用bulkload的形式写入对应HBase表。
注意事项:
- 操作完成后需检查HBase的数据完整性,并手动清除临时目录下的没用的数据文件。
RegionsMerger
使用说明:
对数据表中处于OPEN状态的且连续的Region进行两两合并,直到Region数量小于等于目标数值或连续N轮没有产生有效的Merge操作。
注意事项:
- 合并后Region大小阈值 = hbase.tools.merge.upper.mark(默认0.9) * 单个Region数据量最大值。 2.hbase.tools.max.iterations.blocked用于控制没有产生有效Merge轮数的阈值 3.如确认要大规模回收空Region,必须在检修时,有人值守的情况下使用该工具。
RegionsOnUnknownServersRecoverer
使用说明:
解析HBase的Master日志,对其中unknown_server指向的RegionServer执行ServerCrashProcedure。
OfflineMetaRepair
使用说明:
在HBase文件系统完整的前提下,备份原损坏的hbase:meta表,并使用文件系统中保存的元数据重建hbase:meta表,-details会在重建hbase:meta表之前打印所有Region的信息, -base用于手动指定HBase根目录,-sidelineDir用于指定hbase:meta表的备份目录。
注意事项:
- 务必在HBase集群离线的状态下使用该命令。
使用说明:
使用多线程scan的方式进行数据抽样,进而统计指标,-l用于指定单线程scan操作的行数限制,-f用于指定抽样Region占数据表Region总数的百分比,-r用于指定对某个Region进行抽样, -t用于指定执行scan的线程数。
- 案例
3.1 案例一
3.2 案例二
开始修复
发现执行:hbase hbck -j hbase-hbck2-1.0.0.1.0.0.0-278.jar addFsRegionsMissingInMeta ‘TEST:DATA_HUB_TEST_16’后提示:
1 regions were added to META, but these are not yet on Masters cache.
You need to restart Masters, then run hbck2 'assigns' command below:
assigns a7831e6ca30f45115da47c22469a235c
根据提示重启Master并执行:hbase hbck -j hbase-hbck2-1.0.0.1.0.0.0-278.jar assigns a7831e6ca30f45115da47c22469a235c
重启Master 并执行 assign 但 assign 失败
最后发现addFsMissingRegionInMeta只修复了info:regioninfo列的信息,没有更新HBase Master的缓存,且缺少Region状态信息,重启后Master缓存信息消失,因此assign失败,此时需要执行:
hbase hbck -j hbase-hbck2-1.0.0.1.0.0.0-278.jar setRegionState a7831e6ca30f45115da47c22469a235c CLOSED
再重启Master,执行:hbase hbck -j hbase-hbck2-1.0.0.1.0.0.0-278.jar assigns -o a7831e6ca30f45115da47c22469a235c进行挂载
3.3 案例三
extraRegionsInMeta进行缺失HDFS目录的Region的查询结果表明缺失的Region为e3f853f641d4c0047210531bfe9b45fc,我们需要将该Region在hbase:meta表中的状态置为下线,因此执行:hbase hbck -j /home/hbase/hbase-hbck2-1.0.0.1.0.0.0-278.jar unassigns -o e3f853f641d4c0047210531bfe9b45fc
再使用assigns命令,触发AssignProcedure,创建e3f853f641d4c0047210531bfe9b45fc的数据目录并上线,因此执行:hbase hbck -j /home/hbase/hbase-hbck2-1.0.0.1.0.0.0-278.jar assigns -o e3f853f641d4c0047210531bfe9b45fc
hdfs 上生成了数据目录,但只是生成了目录
- 结语
希望能帮助到大家!以后有相关的问题会继续更新。
版权归原作者 见万事如流 所有, 如有侵权,请联系我们删除。