HBase 安装之后版本的验证的bug:(错误的替换找不到或无法加载主类SLF4J)
Posted 一乐乐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HBase 安装之后版本的验证的bug:(错误的替换找不到或无法加载主类SLF4J)相关的知识,希望对你有一定的参考价值。
HBase 安装之后版本的验证的bug:(错误的替换、找不到或无法加载主类、SLF4J)
问题描述:
验证Hbase是否安装成功时爆出一大堆信息:
/usr/local/hadoop/libexec/hadoop-functions.sh: 行 2360: HADOOP_ORG.APACHE.HADOOP.HBASE.UTIL.GETJAVAPROPERTY_USER:错误的替换 /usr/local/hadoop/libexec/hadoop-functions.sh: 行 2455: HADOOP_ORG.APACHE.HADOOP.HBASE.UTIL.GETJAVAPROPERTY_OPTS:错误的替换 错误: 找不到或无法加载主类 org.apache.hadoop.hbase.util.GetJavaProperty SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/usr/local/hbase/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] HBase 2.2.2 Source code repository git://6ad68c41b902/opt/hbase-rm/output/hbase revision=e6513a76c91cceda95dad7af246ac81d46fa2589 Compiled by hbase-rm on Sat Oct 19 10:10:12 UTC 2019 From source with checksum 4d23f97701e395c5d34db1882ac5021b
解决方式一:修改 hbase-env.sh 文件(hbase-env.sh 在 hbase 安装目录下的 /usr/local/hbase/conf 目录下)
将hbase-env.sh 文件 最后一句:前面的注释去掉。(先到该目录,然后右键该目录,用vim打开)
解决方式二:如果问题还没有得到解决:例如还有一些问题:
(1)“找不到或无法加载主类”的问题:org.apach.hadoop.habase.util.GetJavaProperty
/usr/local/hadoop/bin../libexec/hadoop-functions.sh行HADOOP._ORG.APACHE.HADOOP.HBASE.UTIL.GETJAVAPROPERTY_USER:错误的替换。
解决:修改hbase安装目录下 /bin/目录下的hbase文件:(先到该目录,然后右键该目录,用vim打开)
① 在add_to_cp_if_exists “${HBASE_HOME}/hbase-server/target” 下添加:
# Needed for GetJavaProperty check below add_to_cp_if_exists "${HBASE_HOME}/hbase-server/target/classes"
② 将以下代码注释掉:
#add the hbase jars for each module for f in $HBASE_HOME/hbase-jars/hbase*.jar; do if [[ $f = *sources.jar ]] then : # Skip sources.jar elif [ -f $f ] then CLASSPATH=${CLASSPATH}:$f; fi done
③ 在if [ -n "${HADOOP_IN_PATH}" ] && [ -f "${HADOOP_IN_PATH}" ]; then 下添加:
# If built hbase, temporarily add hbase-server*.jar to classpath for GetJavaProperty # Exclude hbase-server*-tests.jar temporary_cp= for f in "${HBASE_HOME}"/lib/hbase-server*.jar; do if [[ ! "${f}" =~ ^.*\\-tests\\.jar$ ]]; then temporary_cp=":$f" fi done
④ 修改:HADOOP_JAVA_LIBRARY_PATH=$(HADOOP_CLASSPATH="$CLASSPATH" "${HADOOP_IN_PATH}" \\
为:
HADOOP_JAVA_LIBRARY_PATH=$(HADOOP_CLASSPATH="$CLASSPATH${temporary_cp}" "${HADOOP_IN_PATH}" \\
然后保存并退出。
(2)SLF4J 的问题:Class path contains multiple SLF4J bindings.
原因:路径中含有冲突的jar包,如下图所示,一个在hbase路径下另一个在hadoop路径下。
解决:将HBase 或 Hadoop 目录下的 slf4j-logj12-1.7.25.jar, 其中一个改一下,
例如修改 HBase目录下的 slf4j-logj12-1.7.25.jar 为:slf4j-logj12-1.7.25.jar-copy (右键搜索到的文件 -》 重命名)
(3)现在还有问题:HADOOP_ORG.APACHE.HADOOP.HBASE.UTIL.GETJAVAPROPERTY_USER: 错误的替换
解决:直接忽视
参考文章:
《Hbase 出现:/usr/local/hadoop/libexec/hadoop-functions.sh: 行 2360: HADOOP_ORG.APACHE.HADOOP.HBASE.UTIL.》
https://blog.csdn.net/weixin_45048331/article/details/109823555
《启动HBase时提示SLF4J: Class path contains multiple SLF4J bindings的解决方法》
https://blog.csdn.net/qq_45135120/article/details/107048944
《centos7下hbase配置及解决错误: 找不到或无法加载主类 org.apache.hadoop.hbase.util.GetJavaProperty等三个问题》
https://blog.csdn.net/pycrossover/article/details/102627807
hbase的安装配置
环境及版本:
Centos7 (64位)
JDK(1.8)
hadoop(3.1)
hbase(2.0.0)
为了避免版本导致的怪异问题,请多多注意!
在已经装好jdk和hadoop之后装hbase,此hadoop和hbase为分布式的
1.解压hbase2.0.0
2./bin/hbase-env.sh
配置JAVA_HOME路径为本机的路径
3./bin/hbase-site.xml
<configuration> <property> <!-- hbase存放数据目录 --> <name>hbase.rootdir</name> <!-- 端口要和Hadoop的fs.defaultFS端口一致--> <value>hdfs://master:9000/hbase</value> </property> <property> <!-- HBase Web页面--> <name>hbase.master.info.port</name> <value>60010</value> </property> <property> <!-- 是否分布式部署 --> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <!-- list of zookooper --> <name>hbase.zookeeper.quorum</name> <value>master,slave1,slave2</value> </property> <property> <!-- 临时文件路径,如果使用系统默认的tmp会被清除 --> <name>hbase.tmp.dir</name> <value>/data/local/hbase/tmp</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <!-- ZK数据文件路径 --> <name>hbase.zoopkeeper.property.dataDir</name> <value>/data/local/zookeeper/zkdata</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> <property> <name>hbase.unsafe.stream.capability.enforce</name> <value>false</value> </property> <property> <name>hbase.table.sanity.checks</name> <value>false</value> </property> <property> <!-- phoenix支持索引 --> <name>hbase.regionserver.wal.codec</name> <value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value> </property> </configuration>
4./bin/regionservers
配置三台主机名,如果你没有改主机的名字,呢么应该是你的IP地址
5.从phoenix中复制两个jar包过来(至于为什么?我也不知道,对了,phoenix版本5.0.0)
Phoenix-5.0.0-HBase-2.0-server.jar
Phoenix-core-5.5.0-HBase-2.0.jar
6.创建,其中的临时文件夹
7.拷贝hbase文件到其他机器,(你说他是怎么从别的机器上找到hbase文件的呢?因为同路径吗?没试过不同路径的)
8.配置环境变量
export HBASE_HOME=/data/local/hbase/hbase-2.0.0
export PATH=$PATH:${HBASE_HOME}/bin
source /etc/profile //让环境变量生效
9.如果你的环境变量生效了,随便在哪里 :命令 start-hbse.sh
10.检查成功状态 使用java中 jps命令 如果成功就会有下面两个进程(此文件并没有标注hadoop的运行中进程)
master(主节点):
HMaster
HRegionServer(如果你的regionServers 文件中配置了主master,则在主节点上才有,如果没配就只有在salve上才有)
salve(从节点):
HRegionServer
11.遇到的问题及解决
0.HMaster死亡,日志信息:找不到DataNode,检查发现hadoop的DataNode没起来,检查hadoop的问题
1.启动后发现HRegionServer死了,查看日志
ABORTING region server slave1,16020,1547180831222: Unhandled: Unable to find 未找到
缺少上述的Phoenix-5.0.0-HBase-2.0-server.jar包,去phoenix找个包吧(注意版本)
2.启动后还是发现HRegionServer死了(或者个别的HRegionServer死了)
Server yfhadoopd3,60020,1357353729598 has been rejected; Reported time is too far out of sync with master. Time difference of 33455ms > max allowed of 30000ms
时间问题,hbase要求时间是同步的,我配置的时候时间是同步的,所以未配置时间同步,这是hbase很大的一个问题,默认的hbase时差容忍是30秒,当然可以修改配置,网上有无数个这样的教程,推荐ntp 将salve的时间和master的时间进行同步
3.在启动的时候输出口输出了: (slave1:)HBase SLF4J:Class path contains multiple SLF4J bindings
正常的启动情况下我是没有出过这个问题的,我出现这个问题的同时伴随了下面的这个问题,但是这个问题可解,将hbase中的LOG4J包移除,可解这个错误,注意如果他是报的salve1包绑定冲突,就移除slave1的,如果是其他的就移除其他的
4.HRegionServer 死亡,HMaster活着,甚至能进入shell命令行,但是stop-hbase.sh失败
报错信息:2018-07-11 17:50:51,663 INFO [main-SendThread(slave2:2181)] zookeeper.ClientCnxn: Opening socket connection to server slave2/192.168.1.130:2181. Will not attempt to authenticate using SASL (unknown error)
2018-07-11 17:50:52,732 INFO [ReadOnlyZKClient-slave1:2181,slave2:[email protected](slave1:2181)] zookeeper.ClientCnxn: Opening socket connection to server slave1/192.168.1.128:2181. Will not attempt to authenticate using SASL (unknown error)
2018-07-11 17:50:57,623 ERROR [regionserver/slave1:16020] regionserver.HRegionServer: pache/hadoop/fs/ContentSummary; @98: invokestatic
java.lang.VerifyError: Bad type on operand stack
ERROR [regionserver/slave1:16020] regionserver.HRegionServer: RegionServer abort: loaded coprocessors are: []
解决方法:将lib下的hadoop开头的所有包全部删除,从你的hadoop/share 文件夹下得到所有的hadoop开头的jar包移动到lib下,注意:此种方法我的确解决了hbase的这个错误,但是,随之而来的是各种各样的错误,我开始的时候安装过一个hbase,但是各种原因失败了,然后再次安装就报这个问题了。
5.说一下遇到的各种各样的错误
HRegionServer 死亡,HMaster活着,甚至能进入shell命令行,但是stop-hbase.sh失败
Invalid host name: local host is: (unknown); destination host is: "HMaster":。。。找不到记录,大概就是说找不到HMaster 节点了,其实我的IP是有配置的,但是找不到
将配置文件/conf/hbase-site.xml 中的HMaster换成你的IP地址
6.HRegionServer 死亡,HMaster活着,甚至能进入shell命令行,但是stop-hbase.sh失败
regionserver.HRegionServer: ***** ABORTING region server slave1,16020,154711。。***** 好吧,到这我崩溃了,感觉后面的这些问题都是随着问题4 出现的,所以根本上还是解决问题了,所以我重装了系统,运行良好(配置文件完全相同的呢~~,F***)
以上是关于HBase 安装之后版本的验证的bug:(错误的替换找不到或无法加载主类SLF4J)的主要内容,如果未能解决你的问题,请参考以下文章