HBase HBCK运维指南
HBase HBCK是HBase运维人员经常会用到的一个HBase运维工具,主要是用于检查 HBase region等元数据一致性以及修复的工具。
目前HBCK工具有两个版本,本次主要介绍用于HBase 2.x内核版本的HBCK2。后面提到的 HBCK都是只HBCK2,如果涉及HBCK1会单独说明。两个版本的HBCK工具在设计上已经发生的非常大的变化,在使用方式上也有比较大的差异,两个版本的工具只能使用在对应的内核版本上,无法混用。
如何进行检查?
HBCK2跟HBCK1比较,最大的变化就是HBCK2的检查是在HMaster上运行的,HBCK1是运行在客户端的。
HBCK检查主要包含两部分:HBCK Chore Report和CatalogJanitor Consistency Issues Report
HBCK Chore Report:主要检查HMaster内存,RegionServer内存,HDFS三个地方的region信息的一致性,包括region是否存在,region的deploy信息是否一致。由于检查的顺序是HMaster内存(meta表)->RS->HDFS,所以如果meta表region信息不存在,该检查是不会检查出来异常。
该report默认1小时会刷新一次,刷新周期通过参数 hbase.master.hbck.chore.interval,参数值<=0时此功能被禁用。用户也可以手动在hbase shell执行hbck_chore_run来触发。
CatalogJanitor Consistency Issues Report:主要检查meta表中的region信息是否完整,是否存在overlpad,hole问题。该report默认300s会刷新一次,刷新周期通过参数hbase.catalogjanitor.interval。用户也可以手动在hbase shell执行 catalogjanitor_run来触发。catalogjanitor_switch可以用来开启/关闭此功能。
如何查看报告
进入HMaster页面,选择HBCK Report页签查看report。由于report是异步生成,执行命令后,可能需要等待一段时间才能看到结果。
HBCK2使用说明:
HBCK2的工具类文件默认不在HBase客户端的classpath下,需要手动指定才能使用。使用说明以HBase客户端安装目录为/opt/client,使用的jar版本号为hbase-tools-2.2.3-hw- ei-311001-SNAPSHOT.jar为例,实际使用时请以当前的环境信息为准。
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei-311001-
SNAPSHOT.jar COMMAND
其中COMMAND和ARGS参考下面的参数说明。
关于权限,HBCK2跟HBCK1也有很大的不一样,HBCK2不再要求必须使用用户hbase进行操作,只需要当前用户具备当前操作的权限即可。
HBCK2参数(COMMAND)说明:
setTableState
参数说明:设置表的状态。2.x版本开始,HBase的表状态不再记录到zk上,所有表的状态都记录到hbase:meta表的table:state列中(meta表自己除外)。该命令只会将 HMaster缓存以及meta表中的状态强制更新为指定状态,不会操作region。支持的表状态:ENABLED,DISABLED,DISABLING,ENABLING。返回值为更新前的状态。
使用说明:
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar setTableState tableName STATE
举例:
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar setTableState testTable DISABLED
assigns
参数说明:assign region,让region重新上线。该命令支持两个可选的参数-o, -i。
-o, 指定是否强制覆盖当前的Procedure,不指定的话,会对region的状态进行检查,如果该region有关联的Procedure任务或者region的状态不是CLOSED或 OFFLINE,该操作会执行失败;
-i, 如果一次需要操作多个region,除了在命令后面指定多个encoded regionname(空格分开),还可以通过该参数指定一个或多个本地文件,文件内容为 encoded regionname(一行一个region)。
使用说明:
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar assigns encodedRegionName1 encodedRegionName2...
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar assigns -i ileName1 ileName2...
举例:
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar assigns de00010733901a05f5a2a3a382e27dd4
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar assigns de00010733901a05f5a2a3a382e27dd4
如果rit的region很多,可以参考如下截图步骤将所有的rit region拷贝到文本文件中。
bypass
参数说明:中止指定的Procedure任务。当一个Procedure任务长时间未结束需要手动停止时,可以使用该命令。执行该操作可能会导致该任务对应的表,region的状态不一致,需要手动修复。如果命令执行成功则返回true,否则返回false。
该命令支持可选的参数有:-o, -r, -w
-o, Procedure任务执行时会获取一个IdLock,避免一个任务被多个线程处理。 bypass任务时,如果不指定该参数,并且该任务还债运行中,则会导致bypass失败。指定该参数,会强制将任务的bypass标识设置为true。
需要注意:如果bypass的Procedure没有父Procedure,也没有子Procedure,则可以直接bypass;
如果有父Procedure,则当前Procedure的状态不能为RUNNABLE, WAITTING,
WAITTING_TIMEOUT,否则会bypass失败;
如果有子Procedure,则参考下面一个参数的说明。
-r, 如果指定的Procedure还存在subProcedure,则需要指定该参数,然后会把该任务是所有子任务都先bypass掉,否则指定的Procedure会bypass失败。
-w, -o参数中提到的获取IdLock的超时时候,如果没有指定-o的话,会等待获取 IdLock直到超过该超时长。默认1ms。
unassigns
参数说明:将指定的一个或者多个region下线。该操作会为每一个region创建一个
TRSP。
该命令支持参数-o,如果不指定该参数,创建TRSP之前,会检查region的状态,需要同时满足三个条件:region状态为OPEN,该表的状态非DISABLED或 DISABLING, 该region没有关联的Procedure,否则会执行失败。如果该region已有对应的TRSP,新提交的TRSP任务会等待。创建成功则返回新建TRSP的pid,否则返
回-1。该命令只能处理处于OPEN, CLOSING, MERGING, SPLITING状态的 region。
setRegionState
参数说明:该参数用于强制把meta表中的region状态修改为指定的状态。该参数一般需要配合assigns/unassigns命令使用。因为执行assigns/unassigns命令需要 region处于特定的状态,当region状态出现不一致,需要手动干预时,可能需要使用该命令强制将region修改为特定的转改。
使用说明:
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar setRegionState de00010733901a05f5a2a3a382e27dd4 CLOSED
支持修改的状态有:OFFLINE, OPENING, OPEN, CLOSING, CLOSED, SPLITTING, SPLIT,
FAILED_OPEN, FAILED_CLOSE, MERGING, MERGED, SPLITTING_NEW,
MERGING_NEW, ABNORMALLY_CLOSED
filesystem
参数说明:该参数主要用于修复/hbase目录下的不一致问题,开源版本仅提供了修复损坏的HFile文件,错误的reference,HFileLink文件以及hbase.version文件问
题;
MRS版本回合了hbck1的部分功能,包括region目录的空洞,重叠,残留的split region目录等问题。
该参数支持的选项有:
-sidelineCorruptHFiles:检查指定的表(默认全部)是否存在损坏的HFile文件并修复;
-fixReferenceFiles:用于检查指定的表(默认全部)是否存在损坏的HFile文件并修复;
-fixReferenceFiles:用于检查指定的表(默认全部)是否存在损坏的HFile文件并修复;
-fixVersionFile:用于检查指定的表(默认全部)是否存在损坏的HFile文件并修复;该操作不再要求HBase服务可用;
-fix:作用等同于同时指定上面4个参数,该参数为HBCK2开源版本提供的参数,其余参数为MRS特有;
-fixHdfsOrphans: 用于检查修复缺失.regioninfo文件的问题。如果该region目录下没有列簇目录或者,无法修复。修复时先从meta表获取该region的数据并重新生成.regioninfo文件,否则从该region下的hfile解析出startkey和endkey并生
成.regioninfo文件。如果没有hfile,则删除该region目录,然后需要通过- fixHdfsHoles修复region空洞;
-fixHdfsHoles:用于检查和修复region空洞;
-fixHdfsOverlaps:用于检查和修复region重叠;
-removeParents:如果parent和daughter region同时在线,强制下线parent;
-fixSplitParents:如果parent和daugh region部分或者都不在线,需要通过该参数进行修复。如果daughter region的信息没有更新到meta表,则重新将parent region上线,否则尝试将daughter region上线并清理parent region。如果此时 Split region的Procedure任务还未结束,默认不执行修复操作。如果Split Procedure任务执行超过一定时间(默认60s),可以使用-force强制中止该问题。用户还可以使用-timeout修改默认的时间,单位为ms;
-fixTableOrphans:用于检查修复缺少.tableinfo文件的问题,默认从HMaster
的缓存中获取并重新生成.tableinfo文件,如果获取失败,则使用默认的参数生成.tableinfo文件,这样会导致用户设置的参数丢失;
使用说明:
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar filesystem -ix t1 t2
replication
参数说明:用于检查replication的同步队列里面是否还存在已经移除的peer的数据;如果存在,需要通过-f参数进行删除修复;
使用说明:
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar replication -ix t1 t2
scheduleRecoveries
参数说明:创建一个SCP用来处理指定的ServerName。正常情况下,meta表中记录的region所在的ServerName应该是在线的RegionServer,但是记录的 ServerName已经不存在,会导致region一致性的问题,需要通过此命令创建一个 SCP来进行恢复。
使用说明:
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar replication -scheduleRecoveries sn1 sn2
fixMeta
参数说明:用户修复meta表中存在的region空洞和重叠问题。该操作依赖前面介绍中提到的CatalogJanitor Consistency Issues Report,主要是针对该report中的问题进行修复操作。如果meta表和HDFS目录同时出现空洞,应该先对meta表进行修复;
使用说明:
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar fixMeta
listInconsistencies
参数说明:使用命令的方式获取漆面提到的hbck report。当HMaster的原生页面无法访问时,可以通过此方式来获取report;可以指定参数-run需要重新生成hbck repor。默认返回所有的数据,也可以返回指定表的结果;
使用说明:
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar listInconsistencies -run default:t1 default:t2
reportMissingRegionsInMeta
参数说明:检查HDFS和meta表中的region信息,并列出meta表中确实的region信息。需要注意:如果meta表中没有表的state信息,该检查不会对该表进行检查;默认检查所有的表,可以指定一个或者多个namespace或者表,如果是default命名空间下的表,也需要指定命名空间。
使用说明:
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar reportMissingRegionsInMeta namespace1 default:t2
addFsRegionsMissingInMeta
参数说明:reportMissingRegionsInMeta只做检查,该参数检查并修复meta表中确实的region信息。必须指定至少一个namespace或者表;修复的region在meta表中的状态为CLOSED,需要手动执行assigns操作让region上线;
使用说明:
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar addFsRegionsMissingInMeta namespace1 default:t2
extraRegionsInMeta
参数说明:与reportMissingRegionsInMeta相反,用于检查meta表中多余的
region信息。如果需要修复,需要指定参数-fix;使用说明:
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar extraRegionsInMeta -f namespace1 default:t2
fixRITAssignment
参数说明:检查rit超过一定时间的region并尝试修复。该操作只对状态为 FAILED_OPEN并且没有关联的TRSP的region有效。执行成功后,会创建一个新的 TRSP;
使用说明:
hbase hbck -j /opt/client/HBase/hbase/tools/hbase-tools-2.2.3-hw-ei- 311001-SNAPSHOT.jar fixRITAssignment
fixInconsistencies repair
常见问题修复
1. disable一个表失败,部分region除以RIT并且表的状态DISABLING。修复方法:bypass掉该表以及region相关的Procedure任务,然后使用
setTableState将表的状态置为DISABLED。为了保证region的状态一致,建议重新 enable该表后再disalbe一次。
2. region处于RIT无法上线。
修复方案:bypass掉该region的procedure, 然后根据状态决定使用assigns或者 unassigns重新触发TRSP。由于region rit的场景多种多样,实际的修复方案可能需要具体分析。另外,HMaster原生页面的HBCK report里面针对一些异常情况也有修复建议。
3. 数据迁移场景下,将表的目录完整拷贝过来后,如何让表上线?
修复方案一:允许离线的情况下,先停掉HBase服务,然后使用olineMetaRepair进行meta表数据的修复,然后启动HBase服务;