导读
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如果上次没有被正常关闭的话,很容易影响到下一次的使用
评注:
以上只是其中的解决方案,如果能按照上面的方法解决,那算是幸运的,如果不能解决也说正常的,很多情况,因为环境不同,所以出现问题的根本原因是不同的。最重要的还是能找到根本的错误,排除干扰错误,这样问题得到解决。