Hbase故障处理汇总及评注(一)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
日志服务 SLS,月写入数据量 50GB 1个月
简介: Hbase故障处理汇总及评注(一)

导读




    Hbase是企业比较常用的大数据组件,对于开发来讲,单纯的开发几乎不可能,往往都会搭建集群,甚至负责集群的维护,特别是公司规模较小。我们VIP中很多成员,都是一个成员扛起了整个公司的大数据部门,被称之为“扛把子”。


    为了方便大家,在遇到问题的时候,能够尽快的找到解决办法,并且这里关键是对每个异常,都做了评注,可以让我们在看到错误的时候,能够以错误为切入点,学习更多Hbase知识,因此About云整理了Hbase故障分析汇总。


故障分析,这里进行分类:


1.启动故障

2.执行故障

3.操作故障

4.关闭故障


1.启动故障




1、如果启动hbase集群出现regionserver无法启动,日志报告如下类似错误时,说明是集群的时间不同步,只需要同步即可解决。


FATAL org.apache.hadoop.hbase.regionserver.HRegionServer: ABORTING region server 10.210.78.22,60020,1344329095415: Unhandled exceptio

n: org.apache.hadoop.hbase.ClockOutOfSyncException: Server 10.210.78.22,60020,1344329095415 has been rejected; Reported time is too far out of sync with mast

er. Time difference of 90358ms > max allowed of 30000ms

org.apache.hadoop.hbase.ClockOutOfSyncException: org.apache.hadoop.hbase.ClockOutOfSyncException: Server 10.210.78.22,60020,1344329095415 has been rejected;

Reported time is too far out of sync with master. Time difference of 90358ms > max allowed of 30000ms

……

Caused by: org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hbase.ClockOutOfSyncException: Server 10.210.78.22,60020,1344329095415 has been rejected;

Reported time is too far out of sync with master. Time difference of 90358ms > max allowed of 30000ms


只需要执行一下这条命令即可同步国际时间:


/usr/sbin/ntpdate tick.ucla.edu tock.gpsclock.com ntp.nasa.gov timekeeper.isi.edu usno.pa-x.dec.com;/sbin/hwclock –systohc > /dev/null


评注:

对于时间不同步,只要是集群都会出现问题,比较经常遇到问题的,比如zookeeper等。时间保持同步即可。


2、无法启动hbase,regionserver log里会有这样的错误,zookeeper也有初始化问题的错误


FATAL org.apache.hadoop.hbase.regionserver.HRegionServer: ABORTING region server 10.210.70.57,60020,1340088145399: Initialization of RS failed. Hence aborting RS.


因为之前安装配置的时候是好好的,中间经历过强行kill daemon的过程,又是报错初始化问题,所以估计是有缓存影响了,所以清理了tmp里的数据,然后发现HRegionServer依然无法启动,不过还好的是zookeeper启动了,一怒之下把hdfs里的hbase数据也都清理了,同时再清理tmp,检查各个节点是否有残留hbase进程,kill掉,重启hbase,然后这个世界都正常了。


评注:

上面适合非生产情况,如果我们学习可以采用上面的方式来推断错误,也就是上面是因为数据异常导致了HRegionServer有问题。这个里面肯定有其他错误,面对错误,我们不要指盯着一个错误,去想解决办法,我们要多看日志,找到几处错误,去排除,那个是被引发的错误,哪个是是本质的错误,也就是引起集群产生其他错误的根源。找到这个,我们就有了更好的解决办法。


3、无法启动reginserver daemon,报错如下:


Exception in thread “main” java.lang.RuntimeException: Failed construction of Regionserver: class org.apache.hadoop.hbase.regionserver.HRegionServer

Caused by: java.net.BindException: Problem binding to /10.210.70.57:60020 : Cannot assign requested address


解决办法:

根据错误提示,检查ip对应的机器是否正确,如果出错机器的ip正确,检查60020端口是否被占用。


评注:

对于端口的暂用,是比较容易解决的。


如不熟悉,可以参考:

大数据集群【hadoop、hbase、spark、hive,zookeeper、storm等】故障排除之端口详解

https://www.aboutyun.com/forum.php?mod=viewthread&tid=21051


4、Hbase未正常关闭启动报错


org.apache.hadoop.hbase.NotServingRegionException: Region is not online


解决方法:

可先通过hbase hbck进行检查是否正常,一般会提示不一致(INCONSISTENT),一般方法为通过命令:hbase hbck -fix修复。修复成功状态为OK。


评注:

由于Hbase是基于Hadoop,是Hadoop Hbase的简写,因此Hbase是基于Hadoop的数据库,集群如出现副本减少,不健康等,都可以通过修复命令来解决。


关于Hbase hbck用法


opts通用可选项


-help 展示help信息;


-detail 展示所有Region的详情;


-timelag <秒级时间>  处理在过去的指定时间内没有发生过元数据更新的region;


-sleepBeforeRerun <秒级时间>  在执行-fix指令后时睡眠指定的时间后再检查fix是否生效;


-summary 只打印表和状态的概要信息;


-metaonly 只检查hbase:meta表的状态;


-sidelineDir  备份当前的元数据到HDFS上;


-boundaries  校验META表和StoreFiles的Region边界是否一致;


元数据修复选项


在不确定的情况下,慎用以下指令。


-fix 尝试修复Region的分配,通常用于向后兼容;


-fixAssignments 尝试修复Region的分配,用来替换-fix指令;


-fixMeta  尝试修复元数据问题;这里假设HDFS上的region信息是正确的;


-noHdfsChecking  不从HDFS加载/检查Region信息;这里假设hbase:meta表中的Region信息是正确的,不会在检查或修复任何HDFS相关的问题,如黑洞(hole)、孤岛(orphan)或是重叠(overlap);


-fixHdfsHoles  尝试修复HDFS中的Region黑洞;


-fixHdfsOrphans  尝试修复hdfs中没有.regioninfo文件的region目录;


-fixTableOrphans  尝试修复hdfs中没有.tableinfo文件的table目录(只支持在线模式);


-fixHdfsOverlaps  尝试修复hdfs中region重叠的现象;


-fixVersionFile  尝试修复hdfs中hbase.version文件缺失的问题;


-maxMerge   在修复region重叠的现时,允许merge最多个region(默认n等于5);


-sidelineBigOverlaps  在修复region重叠问题时,允许暂时搁置重叠量较大的部分;


-maxOverlapsToSideline   在修复region重叠问题时,允许一组里暂时搁置最多n个region不处理(默认n等于2);


-fixSplitParents 尝试强制将下线的split parents上线;


-ignorePreCheckPermission  在执行检查时忽略文件系统权限;


-fixReferencesFiles 尝试下线引用断开(lingering reference)的StoreFile;


-fixEmptyMetaCells  尝试修复hbase:meta表中没有引用到任何region的entry(REGIONINFO_QUALIFIER为空的行)。


Datafile修复选项


专业命令,慎用。


-checkCorruptHFiles  检查所有HFile —— 通过逐一打开所有的HFile来确定其是否可用;


-sidelineCorruptHFiles  隔离损坏的HFile。该指令中包含-checkCorruptHFiles操作。


Meta修复快捷指令


-repair  是以下指令的简写:-fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans


-fixHdfsOverlaps -fixVersionFile -sidelineBigOverlaps -fixReferenceFiles -fixTableLocks


-fixOrphanedTableZnodes;


-repairHoles  是以下指令的简写:-fixAssignments -fixMeta -fixHdfsHoles。


Table lock选项


-fixTableLocks 删除已持有超过很长时间的table lock((hbase.table.lock.expire.ms配置项,默认值为10分钟)。


Table Znode选项


-fixOrphanedTableZnodes  如果表不存在,则将其在zookeeper中ZNode状态设置为disabled。


hadoop fsck 命令详解

https://www.aboutyun.com/forum.php?mod=viewthread&tid=4869


5、Load Balancer is notenabled


解决方法如下:

进入hbase shell,再输入如下指令即可

hbase(main):001:0> balance_switch true

false

0 row(s) in 0.3590 seconds


评注:

balance_switch true   开启自动balance

balance_switch false  关闭自动balance

注意:开启或关闭自动 balance, 返回的是之前的状态,不是当前状态。


6、Compression Link Errors


因为LZO压缩算法需要在集群中的每台机器都要安装,这是一个启动失败的常见错误。如果你获得了如下信息


11/02/20 01:32:15 ERROR lzo.GPLNativeCodeLoader: Could not load native gpl library

java.lang.UnsatisfiedLinkError: no gplcompression in java.library.path

       at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734)

       at java.lang.Runtime.loadLibrary0(Runtime.java:823)

       at java.lang.System.loadLibrary(System.java:1028)

                   

就意味着你的压缩库出现了问题。


解决办法:

1.没有拷贝lzo本地库到相应目录造成的


在目录/opt/modules/hadoop/hadoop-1.0.2/lib/native/Linux-i386-32下需要有libhadoop*.so和libgplcompression*.so库。


-rw-r--r--. 1 hadoop hadoop  76938 Sep 30 18:17 libgplcompression.a

-rw-rw-r--. 1 hadoop hadoop  1140 Sep 30 18:17 libgplcompression.la

-rwxrwxr-x. 1 hadoop hadoop  59229 Sep 30 18:17 libgplcompression.so

-rwxrwxr-x. 1 hadoop hadoop  59229 Sep 30 18:17 libgplcompression.so.0

-rwxrwxr-x. 1 hadoop hadoop  59229 Sep 30 18:17 libgplcompression.so.0.0.0

-rw-rw-r--. 1 hadoop hadoop 301066 Jul 15 05:40 libhadoop.a

-rw-rw-r--. 1 hadoop hadoop    873 Jul 15 05:40 libhadoop.la

-rw-rw-r--. 1 hadoop hadoop 199000 Jul 15 05:40 libhadoop.so

-rw-rw-r--. 1 hadoop hadoop 199000 Jul 15 05:40 libhadoop.so.1

-rw-rw-r--. 1 hadoop hadoop 199000 Jul 15 05:40 libhadoop.so.1.0.0


2.没有正常设置LD_LIBRARY_PATH



       mapred.child.env

       LD_LIBRARY_PATH=/opt/modules/hadoop/hadoop-1.0.2/lib/native/Linux-i386-32



在mapred-site.xml 配置里需要配置本地库路径。


linux共享库位置配置,Java程序在启动时系统初始化java.library.path属性。

LD_LIBRARY_PATH环境变量主要是用于指定动态链接器(ld)查找ELF可执行文件运行时所依赖的动态库(so)的路java.library.path径,其内容是以冒号分隔的路径列表。ld链接器将优先在该变量设置的路径中查找,若未找到则在标准库路径/lib和/usr/lib中继续搜索。


所以有几种方式来设置LD_LIBRARY_PATH,第一是环境变量,第二是更改/etc/ld.so.conf 文件。


评注:

上面我们只是知道了解决办法,更深层的其实我们可以了解下什么是本地库。


推荐参考:

Hadoop本地库介绍及相关问题解决方法汇总

https://www.aboutyun.com/forum.php?mod=viewthread&tid=7175


7. datanodeCaused by: java.lang.IllegalArgumentException: java.net.UnknownHostException: bonree


错误原因:

hdfs以nameservice的方式提供服务,然后在hbase.rootdir属性配置的就是那个nameservice。在hbase启动regionserver时,错误的把nameservice解析成了host,然后报错。


解决办法:

ln -s ${HADOOP_HOME}/etc/hadoop/hdfs-site.xml ${HBASE_HOME}/conf/hdfs-site.xml

或者这样解决:在hbase-env.sh中HBASE_CLASSPATH的值设置为绝对路径


评注:

dfs.nameservices为集群的名字,当有1个以上namenode时候使用。


8、重启机房服务器后,用./start-hbase.sh启动HBase后,执行hbase shell,出现如下情况


[root@localhost bin]# hbase shell

HBase Shell; enter 'help' for list of supported commands.

Version: 0.20.6, rUnknown, Thu Oct 28 19:02:04 CST 2010

hbase(main):001:0> list

NativeException: org.apache.hadoop.hbase.MasterNotRunningException: null


解决步骤:

1、启动hadoop后,需要等一段时间,再开启hbase

2、去掉hadoop的安全模式:

hadoop dfsadmin -safemode leave

3、把/etc/hosts里的master01的IP改为服务器当前的IP

4、确认hbase的hbase-site.xml中

hbase.rootdir

hdfs://localhost:8020/hbase

与hadoop的core-site.xml中

fs.default.name

hdfs://localhost:8020

红字部分保持一致

5、确认hadoop版本与hbase版本兼容

6、重新执行./start-hbase.sh之前,先kill掉当前的hbase和zookeeper进程


评注:

Hbase由于基于Hadoop,因此首先要启动Hadoop,保障Hadoop是正常的,然后在启动Hbase。


对于Hadoop与Hbase版本兼容,可参考:

hadoop,hbase,hive,zookeeper版本整合兼容性最全,最详细说明【适用于任何版本】

https://www.aboutyun.com/forum.php?mod=viewthread&tid=18015


9、集群关闭了,换了一个新的版本。然后就发现集群再也起不来了。


master起不来,regionserver倒是启动了。


java.io.IOException: Call to namenodename:9000 failed on local exception: java.io.EOFException


解决办法:

出现这种问题主要原因是:hbase中的hadoop-core的jar和hadoop的不兼容,导致连不上hdfs。

故用hadoop的hadoop-core.jar文件替换hbase的hadoop-core.jar文件。修改完以后启动正常~~~


评注:

很多错误,都是因为我们对版本兼容不了解导致的


推荐参考

链接:http://pan.baidu.com/s/1dFyYR3F 密码:yq9u

2.运行故障




1.执行hbase程序orshell命令出现如下提示:


SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/usr/hbase-0.92.1/lib/slf4j-log4j12-1.5.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/usr/hadoop-1.0.3/lib/slf4j-log4j12-1.4.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.


是因为hbase和hadoop里都有这个jar包,选择其一移除即可。


评注:

包冲突,也是比较常见的,而且这个错误也比较明显。很多老铁在查找错误的时候,只是看到了(error)错误,而没有去看这个是什么错误。所以面对一些非常明显的问题,依然不知道怎么解决。所以面对错误的时候,无论我们是什么水平,只要你在学习,就要尝试的去看懂,到底是什么错误。


2.执行hbase的mapreduce作业,有些节点无任何报错正常执行,有些节点总报类似Status : FAILED java.lang.NullPointerException的错误


查看tasktracker的log日志有如下错误:

WARN org.apache.zookeeper.ClientCnxn: Session 0×0 for server null, unexpected error, closing socket connection and attempting reconnect

caused by java.net.ConnectException: Connection refused

官方对这个错误给了说明,

Errors like this… are either due to ZooKeeper being down, or unreachable due to network issues.

当初配置zookeeper时只说尽量配置奇数节点防止down掉一个节点无法选出leader,现在看这个问题貌似所以想执行任务的节点都必须配置zookeeper啊。


评注:

对于Hbase我们尽量在Hbase节点上都按照zookeeper,不至于产生一些意外情况。


3、报告找不到方法异常,但是报告的函数并非自己定义的,也并没有调用这样的函数,类似信息如下:


java.lang.RuntimeException: java.lang.NoSuchMethodException: com.google.hadoop.examples.Simple$MyMapper.()

at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:45)

at org.apache.hadoop.mapred.MapRunner.configure(MapRunner.java:32)

at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:53)

at org.apache.hadoop.mapred.MapTask.run(MapTask.java:209)

at org.apache.hadoop.mapred.TaskTracker$Child.main(TaskTracker.java:1210)

Caused by: java.lang.NoSuchMethodException: com.google.hadoop.examples.Simple$MyMapper.()

at java.lang.Class.getConstructor0(Class.java:2705)

at java.lang.Class.getDeclaredConstructor(Class.java:1984)

at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:41)

… 4 more


网上找到解决方法如下:


This is actually the() function. The display on the web page doesn’t translate into html, but dumps plain text, sois treated as a (nonexistant) tag by your browser. This function is created as a default initializer for non-static classes. This is most likely caused by having a non-static Mapper or Reducer class. Try adding the static keyword to your class declaration, ie:


意思是缺少static关键字~添加上即可。如下:


public static class MyMapper extends MapReduceBase implements Mapper {…}


评注:

系统存在这样的问题的时候还是比较少的,一般都会出一些补丁,对于出现的一些异常,一般都会在新版本中得到解决。所以大家尽量关注一些新的知识。可以节省我们大量的时间。


4、使用mapreduce程序写HFile操作hbase时,可能会有这样的错误:


java.lang.IllegalArgumentException: Can’t read partitions file

Caused by: java.io.IOException: wrong key class: org.apache.hadoop.io.*** is not class org.apache.hadoop.hbase.io.ImmutableBytesWritable


这里需要注意的是无论是map还是reduce作为最终的输出结果,输出的key和value的类型应该是:< ImmutableBytesWritable, KeyValue> 或者< ImmutableBytesWritable, Put>。改成这样的类型就行了。


评注:

Hadoop是有MapReduce的,Hbase其实也是可以有的。我们引入相关包后,即刻实现Hbase MapReduce。


推荐参考:

淘宝之HBase MapReduce实例分析

https://www.aboutyun.com/forum.php?mod=viewthread&tid=7072


5. java.net.ConnectionException:拒绝链接


可能导致该问题的原因及解决方法:


1. 去zookeeper conf/zoo.cfg配置文件查看。这里有两个目录:一个是数据目录dataDir,一个是日志目录dataLogDir,使用cd命令,能不能进入这两个目录下面,如果可以进去,就证明无误。如果提示: 没有那个文件或目录,就使用mkdir命令创建这两个文件夹即可


2.vim /etc/hosts 查看主机名配置是否正确。如果使用和配置有误,进行修改。


3.使用上述办法不能解决——关闭防火墙。

centOS6使用chkconfig iftables off  永久关闭防火墙

service iptables stop    临时关闭防火墙

centOS7 默认的使用firewall作为防火墙

关闭firewall:

systemctl stop firewalld.service #停止firewall

systemctl disable firewalld.service #禁止firewall开机启动

firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)  

 

4.防火墙已经关闭,问题还没有解决,有可能是账户的问题,不妨切换账户试一下。

端口号的问题: zookeeper默认的端口号是2181,但不是所有的都是使用这个端口号!

去 hbase-site.xml里面查看:


    hbase.zookeeper.property.clientPort

    4180

    Property from ZooKeeper's config zoo.cfg.

    The port at which the clients will connect.

   


改变代码里面设置的端口号,问题得到解决!!


5.一个最坑的可能原因就是集群节点的时间不同步,hbase,和zookeeper对时间的要求很高!!好像是误差要在180s。最好的方式就是对整个集群配置时钟同步,或者是使用date命令为每个节点修改时间。


6.以上方案都尝试过,问题仍然不能解决,就重启hbase,和zookeeper试试吧!zookeeper如果上次没有被正常关闭的话,很容易影响到下一次的使用


评注:

以上只是其中的解决方案,如果能按照上面的方法解决,那算是幸运的,如果不能解决也说正常的,很多情况,因为环境不同,所以出现问题的根本原因是不同的。最重要的还是能找到根本的错误,排除干扰错误,这样问题得到解决。



相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
分布式计算 运维 Java
Hbase故障处理汇总及评注(二)
Hbase故障处理汇总及评注(二)
1721 0
|
5月前
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
141 0
|
SQL 分布式计算 Hadoop
Hadoop集群hbase的安装
Hadoop集群hbase的安装
198 0
|
14天前
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
40 3
|
4月前
|
存储 分布式计算 Hadoop
Hadoop节点文件存储HBase设计目的
【6月更文挑战第2天】
50 6
|
4月前
|
存储 分布式计算 Hadoop
Hadoop节点文件存储Hbase高可靠性
【6月更文挑战第2天】
82 2
|
4月前
|
存储 分布式计算 Hadoop
Hadoop节点文件存储Hbase面向列
【6月更文挑战第2天】
36 2
|
5月前
|
分布式计算 安全 Hadoop
HBase Shell-org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet 已解决
在HBase Shell遇到错误时,检查Hadoop非安全模式:`hdfs dfsadmin -safemode get`。问题解决在于`hbase-site.xml`中添加配置:Zookeeper客户端端口设为2181和预写日志提供者设为filesystem。
|
5月前
|
分布式计算 Hadoop Java
Hbase2.2.2在线安装配置(对应Hadoop 3.1.3)
Hbase2.2.2在线安装配置(对应Hadoop 3.1.3)
92 2
|
5月前
|
分布式计算 Hadoop 关系型数据库
Hadoop任务scan Hbase 导出数据量变小分析
Hadoop任务scan Hbase 导出数据量变小分析
88 0