Hive与Hadoop类路径冲突:SLF4J多绑定及方法缺失报错
解决Hive与Hadoop的类路径冲突问题(SLF4J多绑定+Guava方法缺失)
报错信息
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/home/hadoop/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.35.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.apache.logging.slf4j.Log4jLoggerFactory] Exception in thread "main" java.lang.NoSuchMethodError: 'void com.google.common.base.Preconditions.checkArgument(boolean, java.lang.String, java.lang.Object)' at org.apache.hadoop.conf.Configuration.set(Configuration.java:1357) at org.apache.hadoop.conf.Configuration.set(Configuration.java:1338) at org.apache.hadoop.mapred.JobConf.setJar(JobConf.java:536) at org.apache.hadoop.mapred.JobConf.setJarByClass(JobConf.java:554) at org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:448) at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5144) at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5107) at org.apache.hive.beeline.HiveSchemaTool.<init>(HiveSchemaTool.java:96) at org.apache.hive.beeline.HiveSchemaTool.main(HiveSchemaTool.java:1473) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.apache.hadoop.util.RunJar.run(RunJar.java:323) at org.apache.hadoop.util.RunJar.main(RunJar.java:236)
解决方案
1. 处理SLF4J多绑定冲突
错误显示Hive和Hadoop各自携带了SLF4J的不同实现,导致绑定冲突。只需移除其中一个冲突jar即可:
- 定位Hadoop中的冲突jar:
/home/hadoop/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar - 重命名该jar(保留备份方便回滚):
mv /home/hadoop/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar /home/hadoop/hadoop/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar.bak
2. 修复Guava版本不一致问题
NoSuchMethodError是因为Hive和Hadoop依赖的Guava版本不兼容,高版本的Guava才有该方法。统一两者的Guava版本:
- 分别查看Hive和Hadoop的Guava版本:
ls -l /usr/local/hive/lib/guava*.jar ls -l /home/hadoop/hadoop/share/hadoop/common/lib/guava*.jar - 保留版本较高的Guava,替换低版本:
假设Hive的Guava版本更高,执行以下命令:# 备份Hadoop中的旧版本Guava mv /home/hadoop/hadoop/share/hadoop/common/lib/guava-*.jar /home/hadoop/hadoop/share/hadoop/common/lib/guava-old.jar.bak # 复制Hive的高版本Guava到Hadoop的lib目录 cp /usr/local/hive/lib/guava-*.jar /home/hadoop/hadoop/share/hadoop/common/lib/ - 或者通过Hive配置优先加载自身Guava:
复制Hive的hive-env.sh.template为hive-env.sh,添加以下配置:export HIVE_AUX_JARS_PATH=/usr/local/hive/lib/guava-*.jar
3. 验证修复
重新运行Hive的schematool或其他命令,检查是否不再出现报错。
内容的提问来源于stack exchange,提问作者Muath Al-Ghamdi
相关产品推荐
相关产品推荐

