分享

Hbase故障处理汇总及评注

BGnv5 2019-10-25 22:07:35 发表于 总结型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 8229
    导读

     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://> 备份当前的元数据到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 <n>  在修复region重叠的现时,允许merge最多<n>个region(默认n等于5);

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

-maxOverlapsToSideline <n>  在修复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

<property>
        <name>mapred.child.env</name>
        <value>LD_LIBRARY_PATH=/opt/modules/hadoop/hadoop-1.0.2/lib/native/Linux-i386-32</value>
</property>

在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<RETURN>' 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中
<name>hbase.rootdir</name>
<value>hdfs://localhost:8020/hbase</value>
与hadoop的core-site.xml中
<name>fs.default.name</name>
<value>hdfs://localhost:8020</value>
红字部分保持一致
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里面查看:
<property>
     <name>hbase.zookeeper.property.clientPort</name>
     <value>4180</value>
     <description>Property from ZooKeeper's config zoo.cfg.
     The port at which the clients will connect.
     </description>
</property>
改变代码里面设置的端口号,问题得到解决!!

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

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

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

6.windows下开发HBase应用程序,HBase部署在linux环境中,在运行调试时可能会出现无法找到主机,类似异常信息如下:

java.net.UnknownHostException: unknown host: gp-node02

解决办法如下:

在C:\WINDOWS\system32\drivers\etc\hosts文件中添加如下信息:
在linux 的 /etc/hosts也要添加该行信息
192.168.137.139  gp-node02

评注:
其实这个也是网络问题的一种,无论是开发,还是集群搭建,当我们换机器访问的时候,我们需要配置下hosts,如果不配置,就只能使用ip地址访问。

7.执行MapReduce遇到的问题:文件租约超期异常.

org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException
DataNode上有如下信息:IOE:java.io.IOException: xceiverCount 2049 exceeds the limit of concurrent xcievers 2048  

原因:

1.执行操作的时候某文件被删的,避免方式:别同时写一个文件

2.dfs.datanode.max.xcievers参数到达上限,增大dfs.datanode.max.xcievers参数值

评注:
dfs.datanode.max.xcievers 对于datanode来说,就如同linux上的文件句柄的限制,当datanode 上面的连接数操作配置中的设置时,datanode就会拒绝连接。


8、所有节点region server进程挂掉,hbase不可访问,查看日志有如下信息:

java.net.SocketException: Too many open files

解决办法:
修改ulimit 值为8192,在master 节点上执行$hbase_home/bin/start-hbase.sh 重启所有节点上的region server,服务恢复.

评注:
在搭建集群的过程中,我们的准备工作中,都需要修改下句柄,防止出现类似问题。

推荐参考

hbase 0.96整合到hadoop2.2三个节点全分布式安装高可靠文档

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

9、HMaster启动之后马上挂掉

查看日志里面报错信息如下:

2015-10-14 17:48:29,476 FATAL [master:hbase1:60000] master.HMaster: Unhandled exception. Starting shutdown.
org.apache.hadoop.hbase.util.FileSystemVersionException: HBase file layout needs to be upgraded. You have version null and I want version 8. Consult http://hbase.apache.org/book.html for further information about upgrading HBase. Is your hbase.rootdir valid? If so, you may need to run 'hbase hbck -fixVersionFile'.
    at org.apache.hadoop.hbase.util.FSUtils.checkVersion(FSUtils.java:600)
    at org.apache.hadoop.hbase.master.MasterFileSystem.checkRootDir(MasterFileSystem.java:462)
    at org.apache.hadoop.hbase.master.MasterFileSystem.createInitialFileSystemLayout(MasterFileSystem.java:153)
    at org.apache.hadoop.hbase.master.MasterFileSystem.<init>(MasterFileSystem.java:129)
    at org.apache.hadoop.hbase.master.HMaster.finishInitialization(HMaster.java:800)
    at org.apache.hadoop.hbase.master.HMaster.run(HMaster.java:605)
    at java.lang.Thread.run(Thread.java:744)

解决方案 1:

试过了很多方法,最终通过在hdfs中,删除hbase的目录,然后重启hbase master 解决

那么,hbase的目录是哪一个呢?在 : $HBASE_HOME/conf/hbase-site.xml里面配置,通常为/hbase
    <property>
            <name>hbase.rootdir</name>
            <value>/hbase</value>
    </property>

解决方案 2:

查看目录

bin/hadoop fs -ls /hbase

发现/hbase/hbase.version已经消失了,原来是之前的这个文件可能被损坏了,去/lost+found目录找确实能找到,但是这个文件似乎出了问题,-ls它也看不到。做以下操作:

bin/hadoop fs -mv /hbase /hbase.bk

重启HBase,这时就生成了/hbase/hbase.version文件,然后:

bin/hadoop fs -cp /hbase/hbase.version /hbase.bk/

bin/hadoop fs -rmr /hbase

bin/hadoop fs -mv /hbase.bk /hbase

这样再次重启HBase,发现Hbase开始splitting hlogs,数据得以恢复

评注:
上面是两种解决办法,一个可以在学习环境下,一个是在生产环境下。一个问题解决办法其实有多个,我们如果在有能力的情况,能细致的解决问题,这样可以让我们学习,获取更多的知识。

10、regionserver 频繁挂掉的故障

首先regionserver频繁爆出两类错误:
wal.FSHLog: Error syncing, request close of WAL:

以及出现错误:
org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 293 actions: NotServingRegionException: 42 times

以及出现regionserver dead 故障:
Region server exiting java.lang.RuntimeException: HRegionServer Aborted

可能导致该问题的原因及解决方法:
tickTime超时:我们的HBase 并没有设置tickTime,最终hbase与zk的会话最大超时时间并不是zookeeper.session.timeout参数决定的,而是有zk的maxSessionTimeout决定。zk会根据minSessionTimeout与maxSessionTimeout两个参数重新调整最后的超时值,minSessionTimeout=2*tickTime, maxSessionTimeout=20*tickTime。我们的大数据集群,zk的tickTime设置为默认值(2000ms)2秒,因此,最终hbase 与 zk的超时时间就为40秒。经过调整zk的tickTime为6秒,相应的zookeeper.session.timeout为120秒,最终解决regionserver 频繁挂掉的故障。

评注:
关于超时时间,确实很多人遇到过,特别是zookeeper的相关问题。有时候我们需要弄清楚配置之间的关系,才能搞明白,到底是哪个配置起了作用。

3.操作故障

1、创建表格失败,提示信息如下:

org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user 'mingtong' (action=create)

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

1. linux最常见的权限问题即当前使用的账户没有建表权限——用权限更高的账户对该用户进行赋权

2.另一个可能就是namespace命名空间的限制:也就是说只有按照ns的格式来创建表格,例如: create 'nc_table:table','info'(注意: nc_table是一个已经存在的nc)

评注:
权限问题是最常见的,但也是新手最常犯的,我们在复制,黏贴,移动文件,安装配置集群的时候,涉及权限的地方,都需要核实下。

2、运行hbase shell 输入 list,等基本语句报错

ERROR: Can't get master address from ZooKeeper; znode data == null

可能原因:

1. 时间不同步, hbase集群所有莫名其妙的问题都有可能是时间不同步导致的!!!一定要注意!!

2. hbase-site.xml里面的hbase.rootdir对应的ip与core-site.xml中的fs.defaultFS中的路径不同,或者是与hdfs文件系统的端口号不一致!

评注:
上面是zookeeper常见错误,上面只是解决办法之一,同时上面其实只是错误之一,或则说是被其它错误引发的,所以我们遇到问题的时候,首先要综合排查错误,然后找到根本错误,然后解决问题。


3. 表名找不见的问题

org.apache.hadoop.hbase.TableNotFoundException: ns_wangyou.simu_out_GuangXi

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

这个问题很明显是查询的hbase数据库里面没有相应的表名导致的。检查输入的表名是否正确, 如果正确的话,去创建相应的表即可。

评注:
上面其实是非常简单的错误,可是还是很多新手,遇到后不知所措。遇到错误,我们最基本的,可以见文知意,翻译出来自然之道是什么原因。


4. 类找不见的问题!(自己写的类找不见的问题!)

出现该问题的情形: hbase和hadoop的hdfs,mapreduce整合使用的时候:

18/04/16 18:25:06 INFO mapreduce.JobSubmitter: Cleaning up the staging area /user/mingtong/.staging/job_1522546194099_223330
Exception in thread "main" java.lang.RuntimeException: java.lang.ClassNotFoundException: Class mastercom.cn.bigdata.util.hadoop.mapred.CombineSmallFileInputFormat not found

经过各种测试,最终将问题定位在:这一行代码:
Configuration conf = HBaseConfiguration.create();
只要你的configuration使用的是hbase的,而且后面mapReduce的job用到这个conf,就会报这个问题!

解决方法:
乖乖的使用 Configuration conf = new Configuration(); 来创建conf吧。但是这种方法创建的conf,不会去加载hbase-site.xml配置文件,hbase-site.xml里面重要的参数需要手动set!!否则就无法正确的连接到Hbase!

由于上面介绍的问题还会引发下面的报错:
    org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException): No lease on /wangyou/mingtong/mt_wlyh/Data/hbase_bulkload/output/4503/inin (inode 1964063475): File does not exist. Holder DFSClient_NONMAPREDUCE_-769553346_1 does not have any open files.

按照上述方法改进后,该问题就得到解决!

评注:
对于上面也是我们刚接触开发时候,所遇到的,还可以在代码中,设置相关配置项。


5、 与hbase相关jar包找不到的问题

Error:java.lang.ClassNotFoundException:org.apache.hadoop.hbase.client.ConnectionFactory

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

1. 打jar包的时候直接把相应的jar包打进来,这样能够解决问题,但是jar包会有200多M
2. 在执行jar包前执行 export HADOOP_CLASSPATH=$HBASE_HOME/lib/*:classpath,简单有效,但是如果创建hbase连接的操作是在map,reduce里,这种方法依然会报错
3. 在hadoop-env.sh里面,引入hbase的lib目录:操作如下:
exportHADOOP_CLASSPATH=$HBASE_HOME/lib/*:$HADOOP_CLASSPATH,所有的节点都要修改,修改完后要重启集群
4. 将$HBASE_HOME/lib目录下的jar包导入到$HADOOP_HOME/lib目录下,但这样很容易引起jar包冲突,不推荐

评注:
一个问题可能有多个方法,对于找不到类其实方法多种,上面多个方法的核心,都是能够让我们找到相关类。

6、.jdk版本冲突的问题

java.lang.UnsupportedClassVersionError: PR/Sort : Unsupported major.minor version 52.0

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

很简单,使用集群里对应的jdk版本编译就好了。右键项目-->BuildPath -->Configure Build Path --> Java Compiler --->将版本调整成为集群里面对应的版本即可-->apply。重新打jar包,放到集群上跑,问题得到解决

评注:
这个问题,相信大家一看就清楚,熟悉解决办法,遇到的时候,能否熟练操作。

7.执行$ hbase hbck 命令时,出现以下提示:

Invalid maximum heap size: -Xmx4096m
The specified size exceeds the maximum representable size.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

原因:jvm设置的内存过大,减小配置文件hbase-env.sh内的设置即可。例如:
export HBASE_HEAPSIZE=1024

评注:
这里涉及到虚拟机的相关知识,也是Java的基础,只有我们有比较好的基础,才能更好的理解Hbase,Hadoop,Spark等相关JVM、内存等配置。

更多参考

深入理解Java虚拟机_JVM高级特性与最佳实践 第2版
https://www.aboutyun.com/forum.php?mod=viewthread&tid=26485

直接下载
https://pan.baidu.com/s/1EbBWkteyk20kLPJJNGfwjg  提取码: 889n


8、查询hbase的时候报错:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.hadoop.hbase.util.ByteStringer

这个空指针异常也是挺恶心的,我已经正常连接到了hbase,而且表名也是正常的...原来是代码不够严谨: 在一些情况下,根据行键进行查询,可能得到的结果集是null,但是我的代码里并没有加上对可能出现的空指针异常进行处理的机制,然后使用for循环遍历这个空的结果集for (Result result : results)
遍历一个空的结果集当然会报错啦!

解决方法: 前面加上一个判断,就解决了!

评注:
上面表面来看其实是缺包,这是我们排查的第一步,如果确定不缺包的视情况下,我们需要进一步的想,是否是错误,引发了这个错误。所以我们要根据错误,并且推断错误是由什么引发的。

9.连接Hbase时, 明明hbase.zookeeper.quorum 和hbase.zookeeper.property.clientPort的设置都是正确的,却总是报错 INFO client.ZooKeeperRegistry: ClusterId read in ZooKeeper is null

首先,这种情况出现在: 使用的configuration 是 new configuration这种方式获得的.这里: 涉及到一个关键的配置:

zookeeper.znode.parent --> 这个值的默认值是/hbase

但是如果集群里面设置的值不是这个的话,就会抛出这个异常!比如说我们的集群:因为使用 new Configuration()获得的configuration对象是不会读取Hbase的配置文件hbase-site.xml文件的.在代码中将该配置按照hbase-site.xml里面配置的添加进来即可conf.set("zookeeper.znode.parent", "/hbase-unsecure");这样,该问题得到解决!

评注:
这个错误跟第四个问题其实是差不多的,如果配置没有生效,我们可以在代码中设置。确保生效。同时配置也是域的,在代码的设置,会替代配置文件的中的设置。

10、使用bulkload入库遇到的另外一个问题!报错信息如下所示:

Exception in thread "main" java.lang.IllegalArgumentException: Can not create a Path from a null string
      
由报错信息上可以看出来:是在HFileOutputFormat2类里面出现的错误

这个类是使用bulkload方式进行入库的很关键的类

我们接下来一步一步的去定位错误:

抛出来的错误信息是来自于path类的这个方法:

[mw_shl_code=java,true]private void checkPathArg( String path ) throws IllegalArgumentException {
    // disallow construction of a Path from an empty string
    if ( path == null ) {
      throw new IllegalArgumentException(
          "Can not create a Path from a null string");
    }
    if( path.length() == 0 ) {
       throw new IllegalArgumentException(
           "Can not create a Path from an empty string");
    }  
  }[/mw_shl_code]

  根据界面上的报错结合一下: 可以得到path是一个null,

  那么这个空是从何而来,我们继续看源码

[mw_shl_code=java,true]   static void configurePartitioner(Job job, List<ImmutableBytesWritable> splitPoints)
      throws IOException {
    Configuration conf = job.getConfiguration();
    // create the partitions file
    FileSystem fs = FileSystem.get(conf);
    Path partitionsPath = new Path(conf.get("hbase.fs.tmp.dir"), "partitions_" + UUID.randomUUID());
    fs.makeQualified(partitionsPath);
    writePartitions(conf, partitionsPath, splitPoints);
    fs.deleteOnExit(partitionsPath);
   
    // configure job to use it
    job.setPartitionerClass(TotalOrderPartitioner.class);
    TotalOrderPartitioner.setPartitionFile(conf, partitionsPath);
  }[/mw_shl_code]

分析上面的源码,能够产生null的又和path相关的,显然是这行代码:

Path(conf.get("hbase.fs.tmp.dir"), "partitions_" + UUID.randomUUID());

我们不妨测试一下,在获得conf对象后,打印一下hbase.fs.tmp.dir的值,果然为空!

那么问题已经确认,只需要在代码里面加上这行!

conf.set("hbase.fs.tmp.dir", "/wangyou/mingtong/mt_wlyh/tmp/hbase-staging");

问题便得到解决,入库工作得以正常运行!

评注:
当我们编程过程中,产生问题的时候,有些老铁不知所措,然后就在群里提问,这样其实很少人会回答这类问题,而且即使回答,也是不对口的。对于一些异常错误,直接贴出来,其实能解决的概率是非常小的。我们VIP群中,也有成员遇到异常,都是语音远程解决,这里面产生一个错误,可能会有更多相关错误,一个错误,除了非常简单外,很少能推断出到底是哪里的问题。

11、gz压缩文件损坏导致入库失败的问题

ERROR hdfs.DFSClient: Failed to close inode 16886732
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException): No lease on /hbase_bulkload/output/inin (inode 16886732): File does not exist. Holder DFSClient_NONMAPREDUCE_1351255084_1 does not have any open files.

该问题的场景是在对大量的小的.gz压缩文件进行入库的时候,个别压缩文件损坏导致的,解决的方法就是找到那些出错的.gz文件删除掉.

解决方法:
1. 首先去界面查看相应的job执行的日志,日志里有可能会有出错的.gz文件的id信息,找到将其删除.
2. 将入库的文件夹下面的文件按照文件大小进行排序,一般来说,大小为0KB的都是有问题的..  将其get下来,查看能否解压,不能正常解压就干掉
3. 可以使用命令: hdfs fsck path -openforwrite
检测某个文件夹下面文件是否正常

评注:
从上面错误,让我想起了另外一个相关的问题。就是我们的代码从一定意义上来说是没有问题的,可是数据一多或则一乱就产生问题,这就是由于数据格式不一致,造成我们程序的异常。所以这个问题,问别人,是不可能一下子推断出来的,只能是我们慢慢查找,debug,才能发现。

4.关闭故障

1、停止HBase时报错

stop-hbase.sh

stopping hbasecat: /tmp/hbase-root-master.pid: No such file or directory

原因是,默认情况下pid文件保存在/tmp目录下,/tmp目录下的文件很容易丢失,

解决办法:
在hbase-env.sh中修改pid文件的存放路径:
export HBASE_PID_DIR=/data/hadoop/pids

评注:

pid文件记录了该进程的ID,所以我们不要放到临时目录很容易重启被删除,所以我们尽量保存在非临时目录中。



最新经典文章,欢迎关注公众号



作者:BGnv5

技术讨论获取资料,欢迎加微信:BGnv5_Ooooh


名企资源、名企面试题、最新BAT面试题、专题面试题等资源汇总
https://www.aboutyun.com/forum.php?mod=viewthread&tid=27732




本帖被以下淘专辑推荐:

已有(2)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条