使用HBCK2工具修复HBase集群

2021-02-07 14:38:20 浏览数 (1)

HBCK2工具是修复工具,可用于修复Apache HBase集群,包括CDP中的Apache HBase集群。HBCK2工具是Apache HBase hbck工具的下一版本。

要确定正在运行的HBase集群中的不一致或阻塞的列表,可以通过查看主日志来发现。一旦发现问题,就可以使用HBCK2工具修复缺陷或跳过不良状态。HBCK2工具使用交互式修复过程,要求Hbase Master进行修复,而不是在本地进行修复。

HBCK2每次运行时都会执行一个单独的任务。HBCK2工具不会分析正在运行的集群中的所有内容并修复所有问题。相反,您可以使用HBCK2工具来迭代地查找和修复集群中的问题。HBCK2工具使您可以使用交互式命令来一次解决一个问题。

重要

HBCK2工具特定于Apache HBase的内部。使用此工具需要特定于您的CDP运行时版本的二进制文件,并且您必须始终在Cloudera支持和/或Cloudera专业服务的帮助下使用它。如果您认为需要使用HBCK2工具遇到问题,请联系Cloudera支持。

运行HBCK2工具

您可以从目标集群中的命令行界面运行HBCK2工具。

HBCK2工具是hbase-operator-tools二进制文件的一部分。从Cloudera获得hbase-operator-tools二进制文件后,将二进制tarball上传到目标集群并解压缩tarball。HBCK2 JAR文件包含在Cloudera支持提供的操作员工具tarball中,位于 hbase-operator-tools-<version>/hbase-hbck2/hbase-hbck2-<version>.jar.处。

代码语言:javascript复制
[root@cdp hbase-hbck2]# pwd
/root/hbase-operator-tools-1.0.0.1.0.0.0-831/hbase-hbck2
[root@cdp hbase-hbck2]# ls -lrt
total 5860
-rw-r--r-- 1 root root   39080 Jan 22  2020 README.md
-rw-r--r-- 1 root root   23241 Jan 22  2020 log4j-slf4j-impl-2.11.1.jar
-rw-r--r-- 1 root root 1607947 Jan 22  2020 log4j-core-2.11.1.jar
-rw-r--r-- 1 root root  264060 Jan 22  2020 log4j-api-2.11.1.jar
-rw-r--r-- 1 root root 1931038 Jan 22  2020 hbase-tools-1.0.0.1.0.0.0-831.jar
-rw-r--r-- 1 root root 2124226 Jan 22  2020 hbase-hbck2-1.0.0.1.0.0.0-831.jar
[root@cdp hbase-hbck2]#

通过使用“ -j”选项指定JAR路径来运行HBCK2工具,如下所示:

代码语言:javascript复制
$ hbase hbck -j $HOME/hbase-operator-tools-<version>/hbase-hbck2/hbase-hbck2-<version>.jar

运行命令时,将显示HBCK2工具命令行菜单。

代码语言:javascript复制
[root@cdp hbase-hbck2]# hbase hbck -j hbase-hbck2-1.0.0.1.0.0.0-831.jar
SLF4J: Class path contains multiple SLF4J bindings.
…
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
…

作为使用此工具修复HBase集群的Cloudera支持或专业服务人员,您可以使用以下命令以HBase超级用户(通常为hbase)或HBase Principal(如果启用了Kerberos)收集有用的信息:

代码语言:javascript复制
$ hdfs dfs -ls -R /hbase/ 2>&1 | tee /tmp/hdfs-ls.txt
$ hbase hbck -details 2>&1 | tee /tmp/hbase-hbck.txt
$ echo "scan 'hbase:meta'" | hbase shell 2>&1 | tee /tmp/hbase-meta.txt
[root@cdp tmp]# ls -lrt h*txt
-rw-r--r-- 1 root root 13521 Jan 23 02:36 hdfs-ls.txt
-rw-r--r-- 1 root root 59876 Jan 23 02:36 hbase-hbck.txt
-rw-r--r-- 1 root root  6636 Jan 23 02:37 hbase-meta.txt
[root@cdp tmp]#

发现问题

HBCK2工具使您可以使用交互式命令来一次解决一个问题。如果有多个问题,则可能必须迭代运行该工具以查找和解决所有问题。使用以下实用程序和命令等诊断工具来查找问题。

主日志

Apache Hbase Master运行所有集群启动和停止操作、RegionServer分配以及服务器崩溃处理。Hbase Master所做的一切都是在状态机引擎上执行一个过程,并且每个过程都有唯一的过程ID(PID)。您可以通过在主日志中的条目跟踪过程的PID来跟踪过程的生命周期。某些过程可能会生成子过程,并等待子过程完成。

您可以通过跟踪子过程的PID和父PID(PPID)来跟踪子过程。

如果RegionServer分配存在问题,则主服务器将打印类似于以下内容的STUCK日志条目:

代码语言:javascript复制
2018-09-12 15:29:06,558 WARN
org.apache.hadoop.hbase.master.assignment.AssignmentManager: STUCK
Region-In-Transition rit=OPENING, location=va1001.example.org,00001,1000173230599,
table=IntegrationTestBigLinkedList_20180626110336,
region=dbdb56242f17610c46ea044f7a42895b

主用户界面

状态表

通过查看主用户界面主页上的状态表部分,可以在HBase表中找到问题。浏览表列表以识别表是ENABLED, ENABLING, DISABLED,还是DISABLING。您还可以查看处于过渡状态的区域:“OPEN, CLOSED”。例如,如果表已启用,某些区域未处于OPEN状态以及Master日志条目没有任何正在进行的分配,则可能会出现问题。

Procedures&Locks

启动Apache HBase集群时,将在Master用户界面中的Procedures&Locks页面中填充有关过程、锁和WAL文件计数的信息。集群建立后,如果WAL文件数没有减少,则会导致过程阻塞。您可以在此页面上标识这些过程和锁。

您还可以在HBase shell中使用此命令获取锁和过程的列表:

代码语言:javascript复制
$ echo "list_locks"| hbase shell &> /tmp/locks.txt
$ echo "list_procedures"| hbase shell &> /tmp/procedures.txt
Apache HBase金丝雀工具

使用HBase Canary工具来验证集群中分配的状态。您可以运行此工具以仅关注一个表或整个集群。您可以使用以下命令检查集群分配:

代码语言:javascript复制
[root@cdp tmp]# hbase canary -f false -t 6000000 &>/tmp/canary.log
[root@cdp tmp]# cat /tmp/canary.log
21/01/23 03:08:39 INFO tool.Canary: Execution thread count=16

使用-f参数查找失败的区域提取,并将-t参数设置为在指定时间运行。

解决问题

您可以使用HBCK2工具解决问题。

使用HBCK2修复问题时,必须牢记这些。确保这件事:

  • 区域在“分配”期间未处于“CLOSING”状态,在“未分配”期间未处于“OPENING”状态。您可以使用setRegionState命令更改状态。有关更多信息,请参见HBCK2工具命令参考部分。
  • 一次只能修复一张表。

重要

在使用任何HBCK2工具命令之前,请联系Cloudera支持。

解决分配和取消分配问题

您可以通过监视当前未完成锁列表来解决分配和取消分配问题。针对锁定区域的分配将等待,直到释放锁定。分配在该区域上获得排他锁。

修复主启动无法进行的错误

如果您在Master日志中看到错误master startup cannot progress holding-pattern until region online,则表明Master无法启动,因为没有分配hbase:meta的过程。您将看到类似于以下内容的错误消息:

代码语言:javascript复制
2020-04-01 22:07:42,792 WARN org.apache.hadoop.hbase.master.HMaster:
hbase:meta,,1.1588230740 is NOT online; state={1588230740 state=CLOSING,
ts=1538456302300, server=ve1017.example.org,22101,1234567891012};
ServerCrashProcedures=true. Master startup cannot progress in holding-pattern until region onlined.

要解决此问题,请运行以下命令:

代码语言:javascript复制
$ hbase hbck -j $HOME/hbase-operator-tools-<version>/hbase-hbck2/hbase-hbck2-<version>.jar
assigns 1588230740

hbase:namespace系统表可能发生相同的问题。要解决此问题,请运行以下命令:

代码语言:javascript复制
$ hbase hbck -j $HOME/hbase-operator-tools-<version>/hbase-hbck2/hbase-hbck2-<version>.jar
assigns <hbase:namespace encoded region id>

您可以使用以下命令找到名称空间编码的区域标识:

代码语言:javascript复制
$ echo "scan 'hbase:meta',{COLUMNS=>'info:regioninfo',
FILTER=>"PrefixFilter('hbase:namespace')"}" | hbase shell

命名空间编码区域ID是结果中“ ENCODED”字段下的值。

修复hbase:meta区域/表中的缺失区域

如果遇到从hbase:meta表中删除表区域的问题,则可以使用addFsRegionsMissingInMeta解决此问题。确保主服务器在线。该命令不像hbase:meta rebuild命令那样具有破坏性。

要解决此问题,请运行以下命令:

代码语言:javascript复制
$ hbase hbck -j $HOME/hbase-operator-tools-<version>/hbase-hbck2/hbase-hbck2-<version>.jar
addFsRegionsMissingInMeta <NAMESPACE|NAMESPACE:TABLENAME>

该命令将返回包含所有列出的重新插入区域的HBCK2“分配”命令。您必须重新启动主服务器,然后运行addFsRegionsMissingInMeta命令返回的HBCK2“分配”命令以完成修复。

输出示例:

代码语言:javascript复制
Regions re-added into Meta: 2
WARNING:
2 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 7be03127c5e0e2acfc7cae7ddfa9e29e e50b8c1adc38c942e226a8b2976f0c8c

修复hbase:meta区域/表中的额外区域

如果hbase:meta中还有多余的区域,则可能是由于手动拆分,删除/移动区域目录时出现问题,或者在极少数情况下是由于丢失了元数据。

要解决此问题,请运行以下命令:

代码语言:javascript复制
$ hbase hbck -j $HOME/hbase-operator-tools-<version>/hbase-hbck2/hbase-hbck2-<version>.jar
extraRegionsInMeta --fix  <NAMESPACE|NAMESPACE:TABLENAME>...

重要

仅当额外区域与现有有效区域重叠时,才使用--fix选项。否则,请使用assigns命令重新创建区域。

重建hbase:meta

如果hbase:meta因为已损坏而处于脱机状态,那么如果损坏不太严重,则可以使其重新联机。如果名称空间区域在任务区域中,请在初始化期间扫描hbase:meta以检查hbase:meta是否在线。

要检查hbase:meta是否在线,请在Apache HBase shell中运行以下命令:

代码语言:javascript复制
$ echo "scan 'hbase:meta', {COLUMN=>'info:regioninfo'}" | hbase shell

如果此扫描没有引发任何错误,则可以运行以下命令来验证表是否存在:

代码语言:javascript复制
$ hbase hbck -j $HOME/hbase-operator-tools-<version>/hbase-hbck2/hbase-hbck2-<version>.jar
addFsRegionsMissingInMeta <NAMESPACE|NAMESPACE:TABLENAME>

如果在存储中存在regioninfo文件,但是该区域由于问题而被删除,则命令addFsRegionsMissingInMeta会将区域添加回hbase:meta表。

修复删除的引用和损坏的HFiles

要修复挂起的引用和损坏的HFile,请运行以下命令:

代码语言:javascript复制
$ hbase hbck -j $HOME/hbase-operator-tools-<version>/hbase-hbck2/hbase-hbck2-<version>.jar
filesystem --fix [<TABLENAME>...]

HBCK2工具命令参考

您可以在目标集群的命令行界面中使用此HBCK2命令列表。

HBCK2命令

代码语言:javascript复制
addFsRegionsMissingInMeta <NAMESPACE|NAMESPACE:TABLENAME>...

选项:-d,-force_disable如果禁用失败,则使用此选项中止表修复。

assigns [OPTIONS] <ENCODED_REGIONNAME>...

选项:-o,-覆盖使用此选项可以通过另一个过程覆盖所有权。

bypass [OPTIONS] <PID>...

选项:-o,-override如果过程正在运行/卡住,则使用此选项覆盖-r,-recursive使用此选项绕过父项及其子项。

-w,-lockWait使用此选项等待(以毫秒为单位)然后放弃;默认值= 1。

extraRegionsInMeta <NAMESPACE|NAMESPACE:TABLENAME>...

选项:-f,--fix使用此选项可通过删除找到的所有额外区域来修复meta。

filesystem [OPTIONS] [<TABLENAME>...]

选项:-f,--fix使用此选项可对损坏的HFile,错误链接和引用进行旁注。

replication [OPTIONS] [<TABLENAME>...]

选项:-f,--fix使用此选项可修复复制问题。

代码语言:javascript复制
reportMissingRegionsInMeta <NAMESPACE|NAMESPACE:TABLENAME>...

当hbase:meta中缺少区域但目录仍存在于HDFS中时,请使用此命令。

代码语言:javascript复制
setRegionState <ENCODED_REGIONNAME> <STATE>

可能的区域状态:OFFLINE, OPENING, OPEN, CLOSING, CLOSED, SPLITTING, SPLIT, FAILED_OPEN, FAILED_CLOSE, MERGING, MERGED, SPLITTING_NEW, MERGING_NEW, ABNORMALLY_CLOSED。

警告

建议仅将此命令用作最后的手段。示例方案包括因为区域在hbase:meta中处于不一致状态而未发生的未分配/分配。

代码语言:javascript复制
setTableState <TABLENAME> <STATE>

hbase:meta表中可能的表状态和表示形式:ENABLED( x08 x00),DISABLED( x08 x01),DISABLING( x08 x02),ENABLING( x08 x03)。

代码语言:javascript复制
scheduleRecoveries <SERVERNAME>...

计划ServerCrashProcedure(SCP)用于RegionServer的列表。将服务器名称格式设置为'<HOSTNAME>,<PORT>,<STARTCODE>'。

代码语言:javascript复制
unassigns <ENCODED_REGIONNAME>...

选项:-o,-覆盖使用此选项可以通过另一个过程覆盖所有权。

原文链接:https://docs.cloudera.com/cdp-private-cloud-base/7.1.5/troubleshooting-hbase/topics/checking_consistency_in_hbase_tables.html

0 人点赞