HBase 2.0 之修复工具 HBCK2 运维指南

HBase 2.0 之修复工具 HBCK2 运维指南

转载自:https://mp.weixin.qq.com/s/GVMWwB1WsKcdvZGfvX1lcA?spm=a2c4e.11153940.blogcont683107.11.49d762a815MegW

概述

        目前社区已经发布了 HBase 的 2.0 版本,很多公司都希望去尝试新版本上的新功能,但是不得不面对的问题就是当集群出了问题应该如何解决。在之前的  HBase 版本中,我们可以依赖 hbck 来帮助检查问题和修复问题,在新的版本上我们应该如何去处理呢?HBASE-19121[1]给了我们答案——HBCK2。HBCK2   目前发布了 1.0 版本,还在一直开发中,感兴趣的同学看看这个 issue

 

1.WHY HBCK2

        由于之前的 hbck(hbck-1)是会直接去向 region server 或者 hdfs 发送请求进行修复,而在 HBase 2.0 版本上集群内部操作全部都被挪到了 procedure v2(下文都称为 procedure)上进行处理。

 

因为所有的命令都是经过 master 来协调处理,所以在修复时也需要通过 master 进行修复。否则反而可能导致更严重的不一致问题。所以 hbck-1 在 HBase-2.x 版本是不适用的。

 

除此以外,很多 hbck-1 需要处理的问题对于使用 procedure 的 HBase-2.x 已经不再是问题了,所以相比起 hbck-1 来说也精简了很多功能。

 

2.开始使用

 

2.1下载

社区希望把 HBase 相关的外围工具抽离出 HBase 项目,所以在 github 上建了一个 project hbase-operator-tools: hbase-operator-tools[2],HBCK2 也在其中

 

 

2.2 将项目拉取到本地

git  clone  https://github.com/apache/hbase-operator-tools.git

 

2.3 编译

修改 pom 中依赖的 HBase 版本 ,实际使用的 HBase 版本.version>

 

2.4 编译出 jar 

mvn  clean  package

 

2.5 使用

cd 到 HBase 目录下,执行命令:

mvn  clean  package


编译出的 hbck2_jar 包地址

./bin/hbase  org.apache.hbase.HBCK2  <命令>


或者也可以:

./bin/hbase  hbck  -j  <jar 包地址>  <命令>

3 Procedure 简介

       由于目前几乎所有的集群操作都是通过 procedure 进行的,所以 HBCK2 的工作实际就是修复各种不正常的 procedure。所以在这里有必要对 procedure 进行一个简单的介绍。

       一个 procedure 是由一系列的操作组成的,一旦完成后,要么成功,要么失败(ROLL BACK), 不存在中间状态,所以 procedure 是支持事务的。procedure 执行的每一步都会以 log 的形式持久化在 HBase 的 MasterProcWals 目录下,这样

master 在重启时也能通过日志来恢复之前的状态并且继续执行。对于运维而言最重要的一点就是 procedure 在执行过程中会拿好几把锁, 这个在处理问题时是很重要的,因为一旦锁没有释放,再做任何操作也只能是卡住等锁。

 

  1. IdLock:procedure 级别的锁,保证一个 procedure 不会被多个线程同时执行。
  2. 资源锁:对 HBase 的内部资源进行加锁,不同的 procedure 加锁的粒度不同, 目前有 region/table/namespace/region server 级别的锁。

 

        举例来说,假设我 assign 一个 region,那么 procedure 在执行的时候就需要对这个 region 进行加锁,这样如果有别的人想要 unassign 这个 region,或者 drop 这个 region  所在的 table,都需要等最早的 assignment 结束后释放锁了才能执行。这样防止有不一致的情况出现。

 

4. 功能介绍

 

4.1 bypass[OPTIONS]<PID>…

HBCK2 的核心功能,bypass 可以将一个或多个卡住的 procedure 进行释放。

原理很简单,在 procedure 的类里有一个 bypass 的 flag, 每次执行时会检查这个flag 是否为 true,如果为 true 则直接返回 null, 这样 procedure 就会被认为执行成功。而我们的 bypass 就是把这个 procedure 对象中的这个 flag 设为 true。 这样 stuck 的 procedure 就能够不再执行,后续的修复工作才能继续。

返回值为 true 则是成功,false 是失败。

 

参数解析:

-o,--overide

在执行 bypass 之前先会尝试去拿 IdLock, 如果 procedure 还在运行就会超时返回 null,但是设置了这个参数即使拿不到 IdLock 也会去将 procedure 的 bypass

flag 设为 true。

-r,  --recursive

归的 bypass。例如我们 bypass 一个对 table schema 修改的 procedure, 就需要加上-r 参数,才能把这个操作的所有子 procedure 都 bypass 掉。在 bypass 一个 procedure 时也会将这个 procedure 的所有子 procedure 进行递

-w,  --lockWait

上文提到的等待 IdLock 的超时时间配置,默认为 1ms

 

4.2 assigns [OPTIONS] <ENCODED_REGIONNAME>

将一个或多个 region 再次随机 assign 到别的机器上,返回值是创建的 pid 则为成功,-1 则为失败。

参数解析:

-o,--override

这里的 override 跟 bypass 的 override 不同,因为 assign 本身就会创建一个新的procedure, 所以肯定是不涉及到拿 IdLock 的,但是这里涉及到资源锁的问题。因为之前卡住的资源锁即使在 bypass 后也不会释放(用于 fence, 防止更多未知的错误操作),所以需要加一个-o 去手动释放这个资源锁。

 

​​​​​​​4.3 unassigns <ENCODED_REGIONNAME>…

将一个或多个 region unassign,返回值是创建的 pid 则为成功,-1 则为失败。参数解析:

-o,--override,与 assigns 的一致

 

​​​​​​​4.4 setTableState<TABLE><STATE>

可能的 table 状态, ENABLED, DISABLED, DISABLING, ENABLING

在 table 的状态和所有的 region 状态不一致时可以用这个命令进行修复。

 

​​​​​​​4.5 serverCrashProcedures<ServerName>

手动 schedule 一个或多个 serverCrashProcedure, 如果有 serverCrashProcedure 没有执行成功,但是 procedure log 已经丢失了,那么可以利用这个命令进行修复。返回值为创建的 pid 则为成功,-1 则为失败。

patch 在 HBASE-21393[3],目前这个功能在 release 版本还没有。

所有的武器我们都有了,再回顾一下之前提到的问题,我们应该怎么处理呢?在Case 解决中我们会详细阐述应该怎么处理,这里大家可以先思考一下。

5.查找问题

这个章节我们会介绍怎么去发现目前集群可能存在的问题。

 

​​​​​​​5.1 canary tool

模拟用户的读写请求,去访问集群上的表。当我们需要检查集群 meta 上记录的region assignment 跟实际 region server 上打开的 region 是否一致时,可以使用这个命令去检查:

hbase canary -f false -t 6000000

这个命令会向 meta 上的记录的每个 region 发送一个 get 请求,将-f 设为 false 是为了不在遇到第一个错误时退出,-t   则是这个命令的超时时间,我们设成了6000 秒。在执行完成以后可以通过 grep ERROR 来找到那些有问题的 region。

需要注意的是因为是模拟客户端发送的 get 请求,最好将 HBase 的客户端超时时间和超时次数配的小一些,否则会很慢。

 

PS:  canary  本身也很适合用来作为集群可用性的监控,有兴趣的同学可以去了解一下。

 

5.2 页面状态

其实大部分的信息都会在 master 的页面上展示出来,我们来详细的介绍一下:

Procedures & Locks:

可以检查当前所有没有执行完的 procedure 以及所有资源锁,当我们想要 assign 或者 unassign 一个 region 时,需要先去检查下是由有别的 procedure 已经占有了这个资源锁,如果是的话需要现将那个 procedure bypass 掉,或者等待那个

procedure 释放锁。

以看到 EXCLUSIVE 的 lock 只有 region 级别的,图中红框圈出来的就是占有这个锁的 procedure id 以及它的 parent procedure id,  由此我们知道如果想要重新assign/unassign 这个 region,那么一定要 bypass 这个 procedure。

同理,当 Locks 这块没有任何 EXLUSIVE 锁时,我们可以放心的去执行操作而不用担心被卡住。

 

​​​​​​​5.3 OPENING/CLOSING region 的查找

branch-2.0 上最容易出现的问题就是 region 卡在了 OPENNING/CLOSING 状态, 一般处于这两种状态的 region 都会在 rit 的队列中,可以通过点击页面上的链接拿到所有的 region 以及对应的 procedure id。

可以看到现在有 17 个 region 处在 transition 中,我们可以点击红框圈住的这个链接,会展示所有的 region。

 

 

因为我们最后是希望通过 HBCK2 来进行处理,那么最好是可以复制粘贴需要处理的 region 或者 procedure, 所以可以点击圈出的这两个按钮,会以 text 形式展示所有 region 或者所有 procedure。

​​​​​​​5.4 Master 日志

stuck 的 region 会打印以下日志:

WARN [ProcExecTimeout] org.apache.hadoop.hbase.master.assignment.Assignment Manager: STUCK Region-In-Transition rit=OPENING, location=c4-hadoop-tst-st99.bj,42900,1542148656901, table=test_modify, region=8d81f74b324d0503c3fc87f34e9a17cb

6. Case 解决

 

6.1 region 卡在 OPENING/CLOSING 状态

首先找到这些 region 对应的 pid, 然后执行 bypass, 检查是否锁都释放了,如果释放了就再 assign 一遍,如果需要 close,就再 unassign 一次

 

6.2 对 table 的修改有问题如何回退

找到这个修改的 root procedure, bypass -or 来 bypass 所有相关的 procedure, 利用 table unset 来重置 meta,因为 bypass 之后资源锁还是没有释放,所以需要手动加上 override 参数再去全部 assigns 一遍

 

​​​​​​​6.3 Master 起不起来

日志里一般会有这个:

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,1538449648131};  ServerCrashProcedures=true.  Master  startup  cannot  progress,  in  holding-pattern  until  region  onlined.

手动去 assign 一下 meta 表即可,hbase:meta 表的 encoded name 是一个时间戳,比如上面日志的 encoded name 就是 1588230740手动去 assign 一下 meta 表即可,hbase:meta 表的 encoded name 是一个时间

另外 hbase:namespace 表没有 online 也会造成这个问题,同样需要我们去手动assign 一下

 

​​​​​​​6.4 table 卡在 disabling 状态

因为要求是所有 region 都 disabled, 那么解决办法可以是手动把没有 closed 的region 根据 case1 来解决。如果所有 region 都已经是 closed 状态了,那么我可以利用 setTableState 手动将表的状态设为 DISABLED。之后再 drop 都是安全的了。

 

7. 总体解决思路

其实 HBase-2.x 版本的运维思路很简单,因为使用了 procedure,集群出现 meta 跟 regionserver 不一致的状态是很少的,一般都是有 procedure  出问题了。那么我们主要就是看怎么解决这个有问题的 procedure。

如果是 table/namespace 级别的修改,因为设计到很多 region 的锁,如果需要 bypass 的话需要找到 root procedure 然后使用 bypass -or.

如果只是 region 级别的问题,则 bypass -o 即可。

bypass 之后检查 locks 的页面,看看是不是锁都释放了,如果没有锁了则根据需求进行 assign 或者 unassign,或者对 table 的属性进行还原。

参考链接:

  1. https://issues.apache.org/jira/browse/HBASE-19121
  2. https://github.com/apache/hbase-operator-tools
  3. https://issues.apache.org/jira/browse/HBASE-21393

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html中article、section、aside的区别与联系

首先看看我做的图(PS:有点丑)&#xff0c;通俗易懂

优秀的程序员都避开了哪些坑?

程序员薪水有高有低&#xff0c;有的人一个月可能拿30K、50K&#xff0c;有的人可能只有2K、3K。同样有五年工作经验的程序员&#xff0c;可能一个人每月拿20K&#xff0c;一个拿5K。是什么因素导致了这种差异&#xff1f;我特意总结了容易导致薪水低的九大行为表现&#xff0c…

Springboot 集成 Swagger

1、问题描述 随着互联网技术的发展&#xff0c;现在的网站架构基本都由原来的后端渲染&#xff0c;变成了&#xff1a;前端渲染、先后端分离的形态&#xff0c;而且前端技术和后端技术在各自的道路上越走越远。 前端和后端的唯一联系&#xff0c;变成了API接口&#xff1b;API文…

email类型

<!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><form action"demo_form.php"method"get">请输入您的email地址: <input type"email" n…

优秀程序员的 18 大法则

经过多年的积累&#xff0c;我发现&#xff0c;下面这些基本的指导法则&#xff0c;可以帮助我成为一个更加高效的程序员。 程序设计法则&#xff0c;与设计和工程的原理密切相关。下面这些编程法则帮助我让我获益匪浅&#xff0c;所以我想分享给大家&#xff0c;希望也能帮助大…

url类型

<!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><form action"demo_form.php"method"get">请输入网址: <input type"url" name"us…

低效程序员的7个坏习惯

程序员总是想做到尽可能的高效&#xff0c;但很多人往往会觉得力不从心。这是因为他们在多年的编码过程中养成了一些不好的习惯。下面这7个坏习惯绝对是软件工程师需要改掉的。 1.缺乏激情 这已经是一个老生常谈的话题了&#xff0c;但却是真理。写了多年的代码后&#xff0c;程…

Storm消费Kafka异常 - topic其中两个分区达到某个值不进行消费,持续阻塞

Kafka消费storm&#xff0c;突然有两个分区无法消费数据(或重复消费无法提交offset) offset是我们自己进行管理&#xff0c;kafka日志也是正常没有报错&#xff0c;storm日志也是没有报错~ 就是卡住了 1.尝试将partition为0,1的offset记录删除&#xff0c;重新跑一遍&#xff…

为什么跳槽加薪会比内部调薪要高?

有网友在知乎提问&#xff1a; 最近在思考一个问题&#xff0c;为什么跳槽往往意味着加薪&#xff1f; 如果一个人确有价值&#xff0c;为什么在原来的公司没有在薪水上体现出来&#xff1f;如果没有价值&#xff0c;为什么跳槽以后就会加薪&#xff1f;还是可以单纯的解释为&a…

浏览器多代理配置 - SwitchyOmega

转自 https://www.switchyomega.com/settings/ 下载链接&#xff1a;https://proxy-switchyomega.com/download/ 情景模式 代理服务器 代理服务器可以支持 HTTP、HTTPS、SOCKS4、SOCKS5 代理协议。SOCKS 代理协议不支持验证。下图以配置 Shadowsocks 的 SOCKS5 代理协议为例。…

number类型

step&#xff1a;数字间隔 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><form action"demo_form.php"method"get">请输入数值: <input type&qu…

居然还能这样——程序员加薪的新方法

我的朋友A君是个典型的.NET开发人员&#xff0c;技术不错&#xff0c;人品也不错&#xff0c;在一家小公司&#xff08;姑且称为甲公司&#xff09;做项目开发&#xff0c;是技术骨干。 3个月前&#xff0c;他找到我说想跳槽&#xff0c;让我帮忙介绍工作。我说为什么想跳了&am…

range类型

输入包含一定范围内的数字 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><form action"demo_form.php"method"get">请输入数值: <input type&qu…

程序员真的很穷吗?

前几天一位做市场的同事跑过来问&#xff0c;池老师&#xff0c;我有一位朋友&#xff0c;快30了&#xff0c;想转行写程序&#xff0c;您觉得有戏吗&#xff1f;我看了看满目疮痍的他说&#xff0c;如果是你就没戏。 30多岁转行做程序员当然可行&#xff0c;毕竟历史上存在一些…

Hive 行转列,列传行 - Impala 暂不支持

注&#xff1a;Impala 不支持 lateral view explode 一、行转列 (对某列拆分&#xff0c;一列拆多行) 使用函数&#xff1a;lateral view explode(split(column, ,)) num eg: 如表&#xff1a;t_row_to_column_tmp 数据如下&#xff0c;对tag列进行拆分 SQL代码&#xff1a…

Hive 外部表关联分区数据

0. 说明 已经安装好Hadoop和hive环境&#xff0c;hive把元数据存储在mysql数据库。这里仅讨论外部表和HDFS的关联&#xff0c;并且删掉外部表之后&#xff0c;对HDFS上的文件没有影响。 1. 在HDFS创建分区&#xff0c;并存有文件 手工创建或者由程序在HDFS上生成了分区目录&a…

日期选择器date、week、time、datetime、datetime-local类型

下面只写两个类型的代码案例&#xff0c;其他都大同小异 date类型&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>hello</title></head><body><form action"demo_form.php"…

野生程序员的故事

野生程序员是指仅凭对计算机开发的兴趣进入这个行业&#xff0c;从前端到后台一手包揽&#xff0c;但各方面能力都不精通的人。野生程序员有很强大的单兵作战能力&#xff0c;但是在编入“正规军”之后&#xff0c;可能会不适应新的做事方法。 遭遇“野生程序员” 腾讯公司内部…

output.properties data exceeds its limit [2048] HUE执行脚本异常

Hue执行Shell脚本报错 java.io.IOException: output.properties data exceeds its limit [2048]at org.apache.oozie.action.hadoop.LocalFsOperations.getLocalFileContentAsString(LocalFsOperations.java:86)at org.apache.oozie.action.hadoop.LauncherAM.processActionDa…

5种类型的程序员

在我的代码旅程和编程冒险中&#xff0c;我遇到过很多奇怪的敌人&#xff0c;以及陌生的盟友。我发现至少有五种不同类型的代码战士&#xff0c;有的人能成为并肩合作的战友&#xff0c;而有些人似乎只能衬托我的每一个计划。 不过&#xff0c;他们在软件开发这个万神殿中也有着…