Hive初始化报错Exception in thread “main“ java.lang.NoSuchMethodError: com.google.common.base.

在配置Hadoop和Hive时遇到版本不一致的错误,具体表现为`java.lang.NoSuchMethodError`,原因是Hive和Hadoop中的guava.jar版本不同。解决方法是删除Hive中的guava.jar,然后从Hadoop中复制对应版本的guava.jar到Hive的lib目录下,最后重新初始化Hive,问题得到解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在进行Hadoop系列配置时真的踩了很多坑。

这篇时在Hive初始化:

bin/schematool -dbType derby -initSchema

报错:

Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.chng;Ljava/lang/Object;)V
	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:5141)
	at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5104)
	at org.apache.hive.beeline.HiveSchemaTool.<init>(HiveSchemaTool.java:96)
	at org.apache.hive.beeline.HiveSchemaTool.main(HiveSchemaTool.java:1473)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
	at org.apache.hadoop.util.RunJar.main(RunJar.java:236)

这是因为hadoop和hive的两个guava.jar版本不一致,解决方案:
第一步:删除hive里的guava.jar
这个保存在hive的lib里,比如我的就在这个目录里面:

/root/apache-hive-3.1.2-bin/lib/

再用指令rm,删除

[root@master apache-hive-3.1.2-bin]# cd lib
[root@master lib]# rm guava-19.0.jar 
rm: remove regular file ‘guava-19.0.jar’? y
[root@master lib]# ls

第二步:把hadoop里的复制到hive里
我是先进入到hadoop的lib,再用cp指令复制到hive
(cp -r {要复制的文件} {指定复制过去的路径})

[root@master ~]# cd hadoop-3.2.2/share/hadoop/common/lib
[root@master lib]# cp -r guava-27.0-jre.jar /root/apache-hive-3.1.2-bin/lib

最后再回到hive, 再次初始化,终于成功了呜呜呜

[root@master hadoop]# cd /root/apache-hive-3.1.2-bin
[root@master apache-hive-3.1.2-bin]# bin/schematool -dbType derby -initSchema
Metastore connection URL:	 jdbc:derby:;databaseName=metastore_db;create=true
Metastore Connection Driver :	 org.apache.derby.jdbc.EmbeddedDriver
Metastore connection User:	 APP
Starting metastore schema initialization to 3.1.0
Initialization script hive-schema-3.1.0.derby.sql

因为没有直接找到详细的解决方案,折腾很久才解决,故在此做一个记录。

SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/home/had/server/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/opt/module/hadoop-3.2.4/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: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V 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:5141) at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5104) at org.apache.hive.beeline.HiveSchemaTool.<init>(HiveSchemaTool.java:96) at org.apache.hive.beeline.HiveSchemaTool.main(HiveSchemaTool.java:1473) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.hadoop.util.RunJar.run(RunJar.java:323) at org.apache.hadoop.util.RunJar.main(RunJar.java:236)
最新发布
06-26
<think>首先,用户的问题是关于解决SLF4JmultiplebindingsconflictwithHadoopandHive,以及一个异常:Exceptioninthread"main"java.lang.NoSuchMethodErrorcom.google.common.base.Preconditions.checkArgument。用户提到了一个引用[1],但那个引用似乎是一个错误日志的示例,不是直接的解决方案。我需要基于用户的需求提供帮助。用户说:"我想解决由于多个SLF4J绑定导致的Java异常,特别是与HadoopHive相关的日志绑定冲突"。所以,核心问题是两个:1.SLF4J多绑定冲突(multiplebindingsconflict)。2.java.lang.NoSuchMethodError,这可能是由Guava库版本不一致引起的。从错误日志中:-SLF4J警告说有多个绑定:一个在Hadoop的slf4j-reload4j-1.7.35.jar,另一个在Hive的log4j-slf4j-impl-2.17.1.jar。-然后出现异常:NoSuchMethodErrorforcom.google.common.base.Preconditions.checkArgument,这指向Guava库问题。我需要提供解决方案。步骤应该清晰:1.**解决SLF4J绑定冲突:**-SLF4J要求只有一个绑定。冲突是因为HadoopHive都提供了不同的SLF4J绑定实现。-常见解决方案是排除冲突的依赖或统一版本。-对于HadoopHiveHive通常依赖于Hadoop,所以需要检查依赖版本兼容性。2.**解决NoSuchMethodError:**-这个错误通常是由于Guava库版本不一致导致的。HadoopHive可能依赖于不同版本的Guava。-Guava的某些方法在版本间有变化,导致兼容性问题。-解决方案是确保所有组件使用相同版本的Guava。用户提到的是Hive初始化的错误,具体命令是:bin/schematool-dbTypemysql-initSchema。我应该基于标准实践提供建议:-**检查HadoopHive版本兼容性:**Hive3.1.3应该与Hadoop3.x兼容,但需要确认具体小版本。-**处理SLF4J冲突:**-排除多余的SLF4J绑定。例如,在Hive的类路径中,移除或排除Hadoop提供的冲突JAR。-或者,使用依赖管理工具(如Maven)来统一版本。-具体操作:在Hive的安装中,检查lib目录下的JAR文件。移除log4j-slf4j-impl-2.17.1.jar或slf4j-reload4j-1.7.35.jar中的一个。但需要小心,因为HadoopHive都需要日志实现。-**处理Guava问题:**-查找HadoopHive使用的Guava版本。Hadoop3.2.4可能使用一个版本,Hive3.1.3使用另一个。-解决方案:替换GuavaJAR为兼容版本。通常,将Hive的lib中的GuavaJAR替换为Hadoop的版本或反之。-常见做法:删除Hive的lib中旧的GuavaJAR,并复制Hadoop的GuavaJAR过去。参考标准解决方案:-对于SLF4J冲突,可以添加exclusion在依赖中,或者手动移除JAR。-对于Guava错误,Hive文档建议删除Hive的GuavaJAR并使用Hadoop的。用户的环境:-Hadoop:3.2.4-Hive:3.1.3我需要确保回答结构清晰:1.解释问题原因。2.提供逐步解决方案。3.生成相关问题,作为系统指令要求。系统指令:-使用中文回答。-行内数学表达式用$...$,但这里可能不需要数学。-独立公式用$$...$$,但这里可能没有。-LaTeX语法正确。-生成相关问题。-引用的段落末尾添加引用标识,如[^1]。用户提供了引用[1],我应该基于那个,但用户说"上述引用仅供参考",所以我需要谨慎使用。用户说:"参考站内引用:引用[1]:...",但它是错误日志,我可以引用它来说明问题。在回答中,我应该:-开头简述问题。-然后详细步骤。-最后生成相关问题。生成相关问题:-系统指令说:"生成相关问题",并在示例中有"§§相关问题§§"。-所以,在回答末尾添加相关问题。确保回答真实可靠:基于HadoopHive的常见问题解决。结构化回答:1.**问题分析:**解释SLF4J冲突和Guava错误的原因。2.**解决方案步骤:**-步骤1:解决SLF4J绑定冲突。-步骤2:解决Guava版本不一致。3.**验证:**建议如何验证修复。4.**相关问题:**列出相关问题。最终回答用中文。</think>### 解决 SLF4J 多绑定冲突及 Guava 异常问题 您遇到的错误包含两个核心问题: 1. **SLF4J 多绑定冲突**:HadoopHive 的类路径中存在多个 SLF4J 绑定实现(如错误日志所示:`slf4j-reload4j-1.7.35.jar` 和 `log4j-slf4j-impl-2.17.1.jar`),导致日志系统初始化失败[^1]。 2. **`java.lang.NoSuchMethodError` 异常**:由 Guava 库版本不一致引起(具体方法 `com.google.common.base.Preconditions.checkArgument` 在不同版本中签名变化),常见于 HadoopHive 依赖冲突[^1]。 根本原因是 Hadoop 3.2.4 与 Hive 3.1.3 的依赖版本不兼容。Hive 初始化工具(如 `schematool -initSchema`)会加载冲突的 JAR 文件。以下是详细解决方案,**请先备份相关文件**。 --- ### 逐步解决方案 #### 步骤 1: 解决 SLF4J 多绑定冲突 SLF4J 要求仅一个绑定实现。冲突源于 HadoopHive 提供了不同的日志绑定。操作如下: 1. **定位并移除多余的 SLF4J 绑定 JAR**: - 进入 Hive 安装目录:`cd /data/soft/apache-hive-3.1.3-bin` - 移除 Hive 自带的冲突绑定(通常为 `log4j-slf4j-impl-*.jar`): ```bash mv lib/log4j-slf4j-impl-2.17.1.jar /tmp/ # 移出类路径,避免删除 ``` - **为什么有效**:Hadoop 已提供 `slf4j-reload4j-1.7.35.jar`,移除 Hive 的绑定可强制使用 Hadoop 的实现[^1]。 2. **验证 SLF4J 绑定**: - 运行命令检查是否仍有多绑定警告: ```bash bin/schematool -dbType mysql -validate ``` - 如果警告消失,表明冲突已解决。否则,检查 Hadoop 的 `share/hadoop/common/lib/` 目录,确保无其他 SLF4J JAR。 #### 步骤 2: 解决 Guava 版本不一致 (`NoSuchMethodError`) 此错误因 Guava 库版本差异导致。Hadoop 3.2.4 需 Guava ≥ 27.0,而 Hive 3.1.3 自带较低版本。操作: 1. **替换 Hive 的 Guava JAR 为 Hadoop 兼容版本**: - 删除 Hive 的旧 Guava JAR: ```bash rm lib/guava-*.jar # 示例:Hive 3.1.3 默认为 guava-19.0.jar ``` - 从 Hadoop 复制兼容 Guava JAR 到 Hive: ```bash cp /data/soft/hadoop-3.2.4/share/hadoop/common/lib/guava-27.0-jre.jar lib/ ``` - **注意**:Hadoop 3.2.4 使用 `guava-27.0-jre.jar`,确保版本匹配[^1]。 2. **验证 Guava 修复**: - 重新运行初始化命令: ```bash bin/schematool -dbType mysql -initSchema ``` - 成功标志:无 `NoSuchMethodError` 异常,输出包含 `Initialization script completed`。 #### 步骤 3: 整体验证 - 确保环境变量 `HADOOP_HOME` 和 `HIVE_HOME` 正确设置。 - 检查所有操作后的类路径: ```bash echo $CLASSPATH # 确认无冲突 JAR ``` - 测试 Hive 功能:启动 `hive` CLI 并执行简单查询(如 `SHOW DATABASES;`)。 --- ### 预防措施 - **版本兼容性**:始终使用 HadoopHive 的兼容组合(Hive 3.1.x 推荐 Hadoop 3.x)。 - **依赖管理**:若通过 Maven 构建,在 `pom.xml` 中添加 exclusions: ```xml <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> ```
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值