HBCK2
- 对于hbase 2.x版本的集群,hbck1已不再适用。
- hbck2是为hbase 2.x版本专用修复工具,同时相对于hbck1,hbck2的修复并不是通过本地上下文而是通过master执行修复。
- 获取地址和使用
hbck2的使用方法
$ ${HBASE_HOME}/bin/hbase --config /etc/hbase-conf hbck -j ~/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.0.0-SNAPSHOT.jar
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
reportMissingRegionsInMeta
- 用于报告在hbase:meta表缺失但是hdfs目录仍然存在的region
- 需要hbase:meta在线,会对传入的每张表进行比对检查。如果没有缺失会打印no missing regions信息,如果有缺失会打印相关的表名。
- -i可以指定文件批量检查,将需要检查的表按行写入
使用方法
reportMissingRegionsInMeta [<NAMESPACE|NAMESPACE:TABLENAME>...|-i<INPUT_FILE>...]
Options:
-i,--inputFiles take one or more files of namespace or table names
- HBCK2 reportMissingRegionsInMeta default:table_1 default:table_2
- HBCK2 reportMissingRegionsInMeta default:table_1 ns1
- HBCK2 reportMissingRegionsInMeta -i fileName1 fileName2
addFsRegionsMissingInMeta
- 当region不在hbase:meta表中,但是region目录还存在HDFS上时,可以使用addFsRegionsMissingInMeta修复。
- 对于参数传入的表,会将其在hbase:meta表中存在的region和region目录进行一一对比,如果没有匹配上的,会通过读取region目录下的regioninfo元数据文件再次将region创建在hbase:meta表中。
- 再次创建时region会是CLOSED状态,此时region并不在Master的缓存中所以不会上线region。需要使用HBCK2 ‘assign’ 命令来将region上线。
- 该命令返回的是对于所有有缺失的region重新assign的HBCK2 assigns命令
- 注意:如果hbase版本小于2.3,那么要使用assign之前需要滚动重启HMaster。
使用方法
addFsRegionsMissingInMeta [OPTIONS][<NAMESPACE|NAMESPACE:TABLENAME>...|-i <INPUTFILES>...]
Options:
-i,--inputFiles take one or more files of namespace or table names
-o,--outputFile name/prefix of the file(s) to dump region names
-n,--numLines number of lines to be written to each output file
- HBCK2 addFsRegionsMissingInMeta default:tbl_1 n1:tbl_2 n2
- HBCK2 addFsRegionsMissingInMeta -i fileName1 fileName2
- 如果指定-o选项,则该输出文件可以在后续assign命令的-i选项中直接当传入参数使用
assigns
- 用于分配region。该命令可以在Master初始化时使用(如果指定-skip)。
- 返回创建AssignProcedure的pid或者-1
使用方法
assigns [OPTIONS][<ENCODED_REGIONNAME>...|-i <INPUT_FILE>...]
Options:
-o,--override override ownership by another procedure
-i,--inputFiles take one or more files of encoded region names
-b,--batchSize number of regions to process in a batch
- HBCK2 assigns 1588230740 de00010733901a05f5a2a3a382e27dd4
- HBCK2 assigns -i fileName1 fileName2 如果指定-i或–inputFiles,可以传入一个文件。该文件包含region的编码名,一行一个。
- HBCK2 assigns -i fileName1 fileName2 -b 500 -b可以控制分配的批次数量
unassigns
- 用于下线region,可以在master初始化时使用(需指定-skip)。
- 返回创建UnassignProcedure的pid或者-1
- 可以指定region的编码名,也可以使用硬编码名
使用方法
unassigns [OPTIONS][<ENCODED_REGIONNAME>...|-i <INPUT_FILE>...]
Options:
-o,--override override ownership by another procedure
-i,--inputFiles take one or more input files of encoded region names
-b,--batchSize number of regions to process in a batch
- HBCK2 unassigns 1588230740 de00010733901a05f5a2a3a382e27dd4
- HBCK2 unassigns -i fileName1 fileName2
- HBCK2 unassigns -i fileName1 fileName2 -b 500
extraRegionsInMeta
- 用于报告存在hbase:meta表中的但是没有相关目录的region。
- 需要hbase:meta在线。对于传入的每个表,都将hbase:meta表中的region和HDFS上的目录进行比对。
- 如果指定了–fix选项,则多余的region将会从元数据中删除。使用–fix之前,需要先执行报告查看是否存在region overlap的现象,如果有可以执行–fix。
使用方法
extraRegionsInMeta [<NAMESPACE|NAMESPACE:TABLENAME>...|-i<INPUT_FILE>...]
Options:
-f, --fix fix meta by removing all extra regions found.
-i,--inputFiles take one or more input files of namespace or
table names
- HBCK2 extraRegionsInMeta default:table_1 default:table_2 ns1 对default ns下的table_1和table_2、以及ns1下的所有表触发报告
- HBCK2 extraRegionsInMeta -i fileName1 fileName2
filesystem
- 该命令仅仅与文件系统交互,可以报告损坏的hfiles、references、links,hbase.version缺失和完整性问题。
- 默认会检查所有表,并且如果hbase.version缺失会重建
- 使用–fix可以移走损坏的文件和链接,但无法修复region holes(空洞)和orphan(孤立)。
使用方法
filesystem [OPTIONS][<TABLENAME>...|-i <INPUT_FILE>...]
Options:
-f, --fix sideline corrupt hfiles, bad links, and references.
-i,--inputFiles take one or more input files of table names
- HBCK2 filesystem -i fileName1 fileName2
- HBCK2 filesystem test
fixMeta
存在于2.2.1/2.1.6或更新的版本,在做任何修复时,需要保证hbase:meta是正常的
对于hbase:meta表中损坏或状态不一致region做服务端的修复。主要是修复region空洞和重叠等问题,会在hdfs上创建匹配的空目录。
无参数,直接使用
setRegionState
- 设置region状态。修改成功则返回0,失败则返回1。
- 典型场景:因为region在hbase:meta表中状态不一致,导致无法unassigns或者assigns。但比如 region只有在SPLITTING|SPLIT|MERGING|OPEN|CLOSING状态才可以unassigns。
- 注意: 1.该操作为高危操作,作为最后手段使用。 2.在执行命令之前,确保regon没有其他正在运行的procedure,如assign、split等。可以通过list_procedure命令查看。
- region的状态有OFFLINE, OPENING, OPEN, CLOSING, CLOSED, SPLITTING, SPLIT, FAILED_OPEN, FAILED_CLOSE, MERGING, MERGED, SPLITTING_NEW, MERGING_NEW, ABNORMALLY_CLOSED
使用方法
setRegionState [<ENCODED_REGIONNAME><STATE>|-i <INPUT_FILE>...]
Options:
-i,--inputFiles take one or more input files of encoded region names
and states.
- HBCK2 setRegionState de00010733901a05f5a2a3a382e27dd4 CLOSING
- HBCK2 setRegionState -i fileName1 fileName2
setTableState
- 设置表状态,表可能的状态有:ENABLED(\ x08 \ x00),DISABLED(\ x08 \ x01),DISABLING(\ x08 \ x02),ENABLING(\ x08 \ x03)
- hbase shell中可以通过get ‘hbase:meta’, ‘<TABLENAME>’, ‘table:state’ 、describe "<TABLENAME>"来获取表状态使用方法
setTableState [<TABLENAME><STATE>|-i <INPUT_FILE>...]
Options:
-i,--inputFiles take one or more files of table names and states
- HBCK2 setTableState users ENABLED 返回表之前的状态
- HBCK2 setTableState users ENABLED
bypass
- 传入一个或多个procedure的pid来使其跳过到结束,该procedure的父procedure也将被跳过。如果procedure有子procedure将会失败。
- 该操作有可能导致region状态不一致,需要手动修复。同时可能需要Master重启来清除被持有的锁。
使用方法
bypass [OPTIONS][<PID>...|-i <INPUT_FILE>...]
Options:
-o,--override override if procedure is running/stuck
-r,--recursive bypass parent and its children. SLOW! EXPENSIVE!
-w,--lockWait milliseconds to wait before giving up;default=1
-i,--inputFiles take one or more input files of PID's
-b,--batchSize number of procedures to process in a batch
- HBCK2 bypass 48
- HBCK2 bypass -i fileName1 fileName2
generateMissingTableDescriptorFile
- 该命令会检查TableDescriptor是否缓存在Master中,如果没有则会创建一个默认的.tableinfo文件来恢复。该文件中包含表名、列族列表、TableDescriptor和ColumnFamilyDescriptors的配置项。
- 执行该命令之后需要对表或列族进行检查 1.如果表目录缺失或者.tableinfo文件存在则命令无效。 2.该命令仅仅是生成.tableinfo文件,对于orphan表在文件生成后可能还需要另外修复。 3.需要指定表名,不指定会默认为所有缺失该文件的表生成
使用方法
generateMissingTableDescriptorFile [OPTIONS][<TABLENAME>...]
regionInfoMismatch
- 读取hbase:meta表,对比rowkey中和单元格的编码region名,如果有region名的不一致则进行报告。
- 如果因为HBASE-23328bug对相关region有影响,可以使用-f选项更新修复。
regionInfoMismatch
Options:
-f,--fix Update hbase:meta with the corrections
replication
- 查找未删除的复制队列,如果使用-f,则会删除这些队列
使用方法
replication [OPTIONS][<TABLENAME>...|-i <INPUT_FILE>...]
Options:
-f, --fix fix any replication issues found.
-i,--inputFiles take one or more input files of table names
scheduleRecoveries
- 传递的server格式为’<HOSTNAME>,<PORT>,<STARTCODE>'。
- 为传递的server执行ServerCrashProcedure,如果创建成功则返回pid,如果没有创建则返回-1
使用方法
scheduleRecoveries [<SERVERNAME>...|-i <INPUT_FILE>...]
Options:
-i,--inputFiles take one or more input files of server names
- HBCK2 scheduleRecoveries a.example.org,29100,1540348649479
- HBCK2 scheduleRecoveries -i fileName1 fileName2
recoverUnknown
- 对于报告unknow的regionserver执行ServerCrashProcedure。
- 如果创建Procedure成功则返回pid,没有创建则返回-1。该命令存在2.2.7, 2.3.5,2.4.3,2.5.0或更新的版本
发现问题
master logs
Master负责所有region的分配,regionserver的崩溃处理,集群启停。所有这些都是以Procedures的形式在状态机上运行。每个Procedure都有Procedure id,即pid。通过pid可以在日志中跟踪所有的过程。
比如以下就是一个stuck procedure的例子
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,22101,1536173230599, table=IntegrationTestBigLinkedList_20180626110336, region=dbdb56242f17610c46ea044f7a42895b
Master UI
- Master UI: /master-status#tables 可以通过ui观察表的状态
- Master UI: ‘Procedures & Locks’ 可以通过此界面观察正在运行的Procedures和持有锁的情况、以及当前的Master Procedure WALs。 如果发现集群中有卡住的Procedures和锁,或者WALs一直增长,则需要注意。
$ echo"list_locks"| hbase shell &> /tmp/locks.txt
$ echo"list_procedures"| hbase shell &> /tmp/procedures.txt
- Master UI: The ‘HBCK Report’ 该界面会展示两个master的两个进程的定时检查结果。 CatalogJanitor:检查hbase:meta表是否存在overlaps或holes HBCK Chore:比对hbase:meta表与hdfs的目录文件
其他方式
- HBase Canary Tool 可以用来测试region的状态
- 通过scan hbase:meta表来查看region的状态
版权归原作者 zincooo 所有, 如有侵权,请联系我们删除。