天天看点

HBase数据块NotServingRegionException排查结果如下:结果正常备份数据删除该region信息

同一份测试样本,同一天的不同时间段查询HBase表,命中结果不一致。

对比分析两份样本结果差异,发现样本2的结果是样本1的子集,样本1多出42条结果,且都是key 「1b」 开头:

后续多次测试均无法得到样本1的结果,也就是说「数据凭空少了」。

接口问题排查

程序中通过调用后端提供的服务接口进行数据查询,接口日志中 返回结果为空List,无异常。

登录hbase shell手动进行scan查询:

scan ‘ns:table_express’,{STARTROW=>‘1b3e9f822f33977ceefedaa88db41bbd22c2f8845d59ac3d6203b9601dd7669b0000000000000000000000000000000000000000’,ENDROW=>‘1b3e9f822f33977ceefedaa88db41bbd22c2f8845d59ac3d6203b9601dd7669bfffffffffffffffffffffffffffffffffffffffff’}

报错如下:

ERROR: org.apache.hadoop.hbase.NotServingRegionException ns:table_express,1b37fe2afa75581bf5f757449491783878.d4a172571b229e74109df6c03a959588 is not online on node85-47,16020,1547732390682

at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegionByEncodedName(HRegionSer.java:3245

at org.apache.hadoop.hbase.regionserver.HRegionServer.getRegion(HRegionServ.java:3222)

at org.apache.hadoop.hbase.regionserver.RSRpcServices.getRegion(RSRpcService.java:1414)

at org.apache.hadoop.hbase.reg ionserver RSRpcServices.newReg ionScanner(RSRpcServices.java 2947)

at org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:3272) I

at org.apache.hadoop.hbase.shaded.protobuf.generated ClientProtos C l i e n t S e r v i c e s c a l l B l o c k i n g M e t h o d ( C l i e n t P r o t o a t o r g . a p a c h e . h a d o o p . h b a s e . i p c . R p c S e r v e r . c a l l ( R p c S e r v e r . j a v a : 413 ) a t o r g . a p a c h e . h a d o o p . h b a s e . i p c . C a l l R u n n e r . r u n ( C a l l R u n n e r . j a v a : 130 ) a t o r g . a p a c h e . h a d o o p . h b a s e . i p c R p c E x e c u t o r ClientServices callBlockingMethod(ClientProto at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:413) at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:130) at org.apache.hadoop.hbase.ipc RpcExecutor ClientServicescallBlockingMethod(ClientProtoatorg.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:413)atorg.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:130)atorg.apache.hadoop.hbase.ipcRpcExecutorHandler.run(RpcExecutor.java:324)

at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:304)

重复测试其他异常数据均得到 NotServingRegionException 异常,但是其他不在异常范围内的key 可以正常查询。

结论:

1b开头的这些数据所在的region 「不在服务区」。

接口没有返回具体的异常信息,而是返回空,一定程度上会影响判断。

Region问题排查

表状态检查:

hbase hbck -summary ns:table_express

结果如下:

19/09/19 09:53:10 WARN util.HBaseFsck: No HDFS region dir found: { meta => ns:table_express,1b1e73ed71329daa72ffb28f42947ee7d40c9cb7872063682cb511fd16dbbfd1201810277ccbfc2577361956656a23f805afb859,1549491783878.1513a155f24ac2df20b4797077ed6ae0., hdfs => null, deployed => , replicaId => 0 } meta={ENCODED => 1513a155f24ac2df20b4797077ed6ae0, NAME => ‘ns:table_express,1b1e73ed71329daa72ffb28f42947ee7d40c9cb7872063682cb511fd16dbbfd1201810277ccbfc2577361956656a23f805afb859,1549491783878.1513a155f24ac2df20b4797077ed6ae0.’, STARTKEY => ‘1b1e73ed71329daa72ffb28f42947ee7d40c9cb7872063682cb511fd16dbbfd1201810277ccbfc2577361956656a23f805afb859’, ENDKEY => ‘1b37fe2afa75581bf5f7574336f1cdfbf0f902966db54bf38aa505665828929020181207edad0e69052f705b07331e32c00b5aae’}

19/09/19 09:53:10 WARN util.HBaseFsck: No HDFS region dir found: { meta => ns:table_express,1b37fe2afa75581bf5f7574336f1cdfbf0f902966db54bf38aa505665828929020181207edad0e69052f705b07331e32c00b5aae,1549491783878.d4a172571b229e74109df6c03a959588., hdfs => null, deployed => , replicaId => 0 } meta={ENCODED => d4a172571b229e74109df6c03a959588, NAME => ‘ns:table_express,1b37fe2afa75581bf5f7574336f1cdfbf0f902966db54bf38aa505665828929020181207edad0e69052f705b07331e32c00b5aae,1549491783878.d4a172571b229e74109df6c03a959588.’, STARTKEY => ‘1b37fe2afa75581bf5f7574336f1cdfbf0f902966db54bf38aa505665828929020181207edad0e69052f705b07331e32c00b5aae’, ENDKEY => ‘1b50b073e140ffd3bdb3d9eca2bd7a1db27eb757a06dee480f2ebd537ca0f44d201812187ab3f7d880e20053ee071eab7d0d5360’}

2 inconsistencies detected.

Status: INCONSISTENT

检测到2个不一致信息。

此外,在hbase web ui中,该表的region块存在 所有数值都为0的异常情况:

可以确认是该表的region数据发生异常,且日志中异常的region信息如下:

ns:table_express,1b1e73ed71329daa72ffb28f42947ee7d40c9cb7872063682cb511fd16dbbfd1201810277ccbfc2577361956656a23f805afb859,1549491783878.1513a155f24ac2df20b4797077ed6ae0.

ns:table_express,1b37fe2afa75581bf5f7574336f1cdfbf0f902966db54bf38aa505665828929020181207edad0e69052f705b07331e32c00b5aae,1549491783878.d4a172571b229e74109df6c03a959588.

此信息为 hbase:meta 表中的rowkey,根据meta表rowkey的组成规则,取rowkey中最后一段的encode编码信息,到hdfs上验证该region数据目录是否存在:

hadoop fs -ls /hbase/data/ns/table_express/1513a155f24ac2df20b4797077ed6ae0

ls:

/hbase/data/ns/table_express/1513a155f24ac2df20b4797077ed6ae0

: No such file or directory

可以看到,该region在hdfs上对应的数据目录消失了。

进入 hbase shell 中查询meta表异常rowkey对应的值:

get ‘hbase:meta’,‘ns:table_express,1b1e73ed71329daa72ffb28f42947ee7d40c9cb7872063682cb511fd16dbbfd1201810277ccbfc2577361956656a23f805afb859,1549491783878.1513a155f24ac2df20b4797077ed6ae0.’

结果如下:

info:regioninfo timestamp=1566891946444, value={ENCODED => 96dd94004c9dd9fce3f4eb80c885ad85, NAME => ‘ns:table_express,0778ba8d2889fe7343ffc120c4ae83da0778ba8d2889fe7343ffc120c4ae83da,1559425462970.96dd94004c9dd9fce3f4eb80c885ad85.’, STARTKEY => ‘0778ba8d2889fe7343ffc120c4ae83da0778ba8d2889fe7343ffc120c4ae83da’, ENDKEY => ‘0857

87e9323caa99fc45325a351797fdd4849891167b36bfc6241197b5a58cb1201802142fd6fdc3bf0b5b9cb8faf80d04b71d1a’}

info:seqnumDuringOpen timestamp=1566891946444, value=\x00\x00\x00\x00\x00\x00\x02’

info:server timestamp=1566891946444, value=node85-104:16020

info:serverstartcode timestamp=1566891946444, value=1563956428836

info:sn timestamp=1566891945886, value=node85-104,16020,1563956428836

info:state timestamp=1566891946444, value=OPEN

元数据信息正常,至此,可以确认问题原因:

元数据显示该region在正常提供服务中,客户端到具体节点上检索数据时发现该region的数据目录不存在,抛出异常。

附:meta表结构

hbase:meta表结构如下:

rowkey: 表 名 , {表名}, 表名,{起始键}, r e g i o n 时 间 戳 . {region时间戳}. region时间戳.{encode编码}.

info:state:Region状态,正常情况下为 OPEN

info:serverstartcode:RegionServer启动的13位时间戳

info:server:所在RegionServer 地址和端口,如node85-47:16020

info:snserver:和serverstartcode组成,如node85-47:16020,1549491783878

info:seqnumDuringOpen:Region在线时长的二进制串

info:regioninfo:region的详细信息,如:ENCODED、NAME、STARTKEY、ENDKEY等

其中,regioninfo是重要信息:

ENCODED:基于 表 名 , {表名}, 表名,{起始键}, r e g i o n 时 间 戳 生 成 的 32 位 m d 5 字 符 串 , r e g i o n 数 据 存 储 在 h d f s 上 时 使 用 的 唯 一 编 号 , 可 以 从 m e t a 表 中 根 据 该 值 定 位 到 h d f s 中 的 具 体 路 径 。 r o w k e y 中 最 后 的 {region时间戳}生成的32位md5字符串,region数据存储在hdfs上时使用的唯一编号,可以从meta表中根据该值定位到hdfs中的具体路径。 rowkey中最后的 region时间戳生成的32位md5字符串,region数据存储在hdfs上时使用的唯一编号,可以从meta表中根据该值定位到hdfs中的具体路径。rowkey中最后的{encode编码}就是 ENCODED 的值,其是rowkey组成的一部分。

NAME:与ROWKEY值相同

STARTKEY:该region的起始键

ENDKEY:该region的结束键

修复过程

使用元数据修复工具

尝试直接使用命令修复:

hbase hbck -repair ns:table_express

hbase hbck -fixMeta

执行失败:HBase 2.0 中已经不支持元数据修复工具,只支持「查看」类型的操作,不支持「读入」类型的操作。

使用hdfs工具检查是否有文件块异常:

hdfs fsck /hbase

结果正常

手动修复元数据

备份原有的region信息:

get ‘hbase:meta’,‘ns:table_express,1b37fe2afa75581bf5f7574336f1cdfbf0f902966db54bf38aa505665828929020181207edad0e69052f705b07331e32c00b5aae,1549491783878.d4a172571b229e74109df6c03a959588.’

备份数据

删除该region信息

delete ‘hbase:meta’,‘ns:table_express,1b37fe2afa75581bf5f7574336f1cdfbf0f902966db54bf38aa505665828929020181207edad0e69052f705b07331e32c00b5aae,1549491783878.d4a172571b229e74109df6c03a959588.’,‘info:regioninfo’

delete ‘hbase:meta’,‘ns:table_express,1b37fe2afa75581bf5f7574336f1cdfbf0f902966db54bf38aa505665828929020181207edad0e69052f705b07331e32c00b5aae,1549491783878.d4a172571b229e74109df6c03a959588.’,‘info:server’

delete ‘hbase:meta’,‘ns:table_express,1b37fe2afa75581bf5f7574336f1cdfbf0f902966db54bf38aa505665828929020181207edad0e69052f705b07331e32c00b5aae,1549491783878.d4a172571b229e74109df6c03a959588.’,‘info:serverstartcode’

delete ‘hbase:meta’,‘ns:table_express,1b37fe2afa75581bf5f7574336f1cdfbf0f902966db54bf38aa505665828929020181207edad0e69052f705b07331e32c00b5aae,1549491783878.d4a172571b229e74109df6c03a959588.’,‘info:sn’

delete ‘hbase:meta’,‘ns:table_express,1b37fe2afa75581bf5f7574336f1cdfbf0f902966db54bf38aa505665828929020181207edad0e69052f705b07331e32c00b5aae,1549491783878.d4a172571b229e74109df6c03a959588.’,‘info:state’

delete ‘hbase:meta’,‘ns:table_express,1b37fe2afa75581bf5f7574336f1cdfbf0f902966db54bf38aa505665828929020181207edad0e69052f705b07331e32c00b5aae,1549491783878.d4a172571b229e74109df6c03a959588.’,‘info:seqnumDuringOpen’

刷新hbase web ui页面,发现 d4a172571b229e74109df6c03a959588 region 已经消失。

执行hbck -summary 发现 不一致的部分由2变成了1。

尝试:

hbase shell中手动scan

通过接口重新查询该值

可以成功获得结果。

继续删除 1513a155f24ac2df20b4797077ed6ae0 region块对应的meta数据后,重新测试数据样本,可得到正确的结果。

问题分析

d4a172571b229e74109df6c03a959588

1513a155f24ac2df20b4797077ed6ae0

以上两个reigon在split时,子region的数据块已经并在meta表中更新上线提供正常服务,父region的数据块已删除,但是 meta表中没有更新对应的元数据信息(原因仍待排查)。

导致对应的数据查询时,仍然通过父region检索数据,但是父region的数据已被删除,故无法成功检索。

可以通过以下命令列出该表在meta表中所有的region信息,分析排查是否有相关的region范围 覆盖了有问题的region数据:

echo “scan ‘hbase:meta’,{FILTER => org.apache.hadoop.hbase.filter.PrefixFilter.new(org.apache.hadoop.hbase.util.Bytes.toBytes(‘ns:table_express’))}” | hbase shell | awk -F ’ ’ ‘{print $1}’ | grep table_express | grep -v bak | sort | uniq

来判断消失的region块是否已经由其他region托管服务。

NotServingRegionException 大概率是Region转换过程中出现了问题,通过 hbase:meta 表 和其中记录的region信息可以帮助我们定位问题所在,所以掌握meta表结构和相关存储规则是一个很有效的工具。

继续阅读