Hive启动报错:IllegalAccessError及SLF4J多绑定问题咨询
我来帮你一步步搞定这两个启动问题:
一、处理SLF4J多绑定警告
这个警告的根源是你的类路径里同时存在多个SLF4J日志实现绑定,导致SLF4J无法确定使用哪一套,清理掉重复的绑定jar就能解决:
第一步:定位冲突的jar包
从日志里能明确看到冲突来源:- HBase的
phoenix-5.0.0-HBase-2.0-client.jar(内置了SLF4J绑定) - HBase lib目录下的
slf4j-log4j12-1.7.25.jar - Hadoop common lib目录下的
slf4j-log4j12-1.7.25.jar - Hive自带的
log4j-slf4j-impl-2.10.0.jar
- HBase的
第二步:统一保留一套绑定实现
推荐保留Hive自带的Log4j2绑定(log4j-slf4j-impl-2.10.0.jar),毕竟Hive3.x默认适配这套。你可以:- 删除HBase lib目录下的
slf4j-log4j12-1.7.25.jar - 删除Hadoop common lib目录下的
slf4j-log4j12-1.7.25.jar - 如果不需要在Hive里用Phoenix,可以暂时把
phoenix-5.0.0-HBase-2.0-client.jar从HBase lib移到其他目录,或者启动Hive时排除这个jar的类加载。
要是必须保留Phoenix,也可以启动Hive时通过JVM参数强制指定SLF4J实现:
hive -Dslf4j.loggerFactory=org.slf4j.impl.Log4jLoggerFactory- 删除HBase lib目录下的
二、解决IllegalAccessError错误
这个错误是类加载冲突导致的:org.apache.hadoop.hdfs.protocol.HdfsFileStatus尝试访问org.apache.hadoop.fs.FileStatus的私有字段NONE,大概率是HBase jar里的旧版Hadoop类和你当前用的Hadoop3.1.1冲突了。
给你几个可行的解决方法:
方法1:隔离HBase的类路径
如果你不需要在Hive里操作HBase,别把HBase的lib目录加到全局CLASSPATH里。检查/etc/profile或者~/.bashrc,如果有类似export CLASSPATH=$CLASSPATH:/usr/local/hbase-2.0.6/lib/*的配置,注释掉它,重新登录终端后再启动Hive。方法2:让Hive和Hadoop的类优先加载
修改Hive启动脚本,确保Hive和Hadoop的jar先被加载,避免HBase的旧类干扰。编辑$HIVE_HOME/bin/hive脚本,在开头添加:export HADOOP_OPTS="-Djava.net.preferIPv4Stack=true -Dhadoop.classpath=${HIVE_HOME}/lib/*:${HADOOP_HOME}/share/hadoop/common/*:${HADOOP_HOME}/share/hadoop/hdfs/*:${HADOOP_HOME}/share/hadoop/mapreduce/*:${HADOOP_HOME}/share/hadoop/yarn/*"方法3:匹配Hadoop与HBase版本依赖
HBase2.0.6本身支持Hadoop3.1.x,但如果HBase lib里有旧的Hadoop依赖jar,可以替换成你当前Hadoop3.1.1的对应jar(比如hadoop-common-3.1.1.jar、hadoop-hdfs-3.1.1.jar等)。
验证
完成上述操作后,重新执行hive命令,应该就能正常进入Hive CLI,不再出现这两个问题了。
内容的提问来源于stack exchange,提问作者user9893492

