启动Hive和Hadoop的兼容性问题:java.lang.VerifyError: class org.apache.log4j.bridge.LogEventAdapter overrides

问题描述

我的Hadoop版本是3.4.2,Hive版本是4.0.1。现在是2025年10月26日,都是最新的版本。

启动Hive后,提交SQL语句,在尝试启动Mapred任务时会报错:
java.lang.VerifyError: class org.apache.log4j.bridge.LogEventAdapter overrides final method getProperty.(Ljava/lang/String;)Ljava/lang/String;

2025-10-26 16:24:37,703 ERROR [main] org.apache.hadoop.mapreduce.v2.app.MRAppMaster: Error starting MRAppMaster java.lang.VerifyError: class org.apache.log4j.bridge.LogEventAdapter overrides final method getProperty.(Ljava/lang/String;)Ljava/lang/String; at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:473) at java.net.URLClassLoader.access$100(URLClassLoader.java:74) at java.net.URLClassLoader$1.run(URLClassLoader.java:369) at java.net.URLClassLoader$1.run(URLClassLoader.java:363) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:362) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at org.apache.log4j.builders.BuilderManager.<clinit>(BuilderManager.java:58)

java.lang.VerifyError: class org.apache.log4j.bridge.LogEventAdapter overrides final method getTimeStamp.()J
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
        at org.apache.log4j.builders.BuilderManager.<clinit>(BuilderManager.java:58)
        at org.apache.log4j.config.Log4j1Configuration.<init>(Log4j1Configuration.java:46)
        at org.apache.log4j.config.PropertiesConfiguration.<init>(PropertiesConfiguration.java:90)
        at org.apache.log4j.config.PropertiesConfigurationFactory.getConfiguration(PropertiesConfigurationFactory.java:58)
        at org.apache.logging.log4j.core.config.ConfigurationFactory$Factory.getConfiguration(ConfigurationFactory.java:499)
        at org.apache.logging.log4j.core.config.ConfigurationFactory$Factory.getConfiguration(ConfigurationFactory.java:404)
        at org.apache.logging.log4j.core.config.ConfigurationFactory.getConfiguration(ConfigurationFactory.java:318)

解决方案

实际上是log4j jar包冲突。我的解决方法是在 Hadoop 环境中禁用 log4j-1.2-api 桥接包

在每台节点执行:

cd /usr/local/hive/lib/ # hive安装路径
sudo mv log4j-1.2-api-*.jar ~/backup_log4j_conflict/ # 临时存一下
sudo mv log4j-slf4j-impl-*.jar ~/backup_log4j_conflict/

(Hive 启动依旧正常,因为它会 fallback 到 log4j-core)

然后重启yarn和hive server2

再次运行SQL测试成功

在这里插入图片描述

### 解决 Hive Metastore 启动时因 `java.lang.ClassNotFoundException: org.apache.logging.log4j.spi.AbstractLoggerAdapter` 导致的问题 Hive Metastore 启动时遇到 `java.lang.ClassNotFoundException: org.apache.logging.log4j.spi.AbstractLoggerAdapter` 的问题,通常与日志框架的依赖冲突或缺失有关。以下是详细分析解决方案。 #### 1. 检查 Log4j SLF4J 依赖 Hive 使用 Log4j 作为其日志记录框架,而 SLF4J 是一个抽象层,允许应用程序在不同日志实现之间切换。如果 Maven 项目中存在多个版本的日志框架依赖,可能会导致类加载冲突。需要检查项目的 `pom.xml` 文件,确保以下依赖正确配置: ```xml <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.x</version> <!-- 确保版本兼容 --> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.x</version> <!-- 确保版本兼容 --> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.x</version> <!-- 确保版本兼容 --> </dependency> ``` 如果 `log4j-slf4j-impl` 被标记为 `provided`,可能无法正确加载类[^2]。建议删除 `provided` 标记,确保依赖在运行时可用。 #### 2. 检查依赖冲突 通过执行以下命令,检查是否存在依赖冲突: ```bash mvn dependency:tree ``` 如果发现多个版本的 `log4j` 或 `slf4j` 存在,可能导致类加载失败。例如,以下情况表明存在冲突: ``` [INFO] +- org.apache.logging.log4j:log4j-core:jar:2.17.1:compile [INFO] +- org.apache.logging.log4j:log4j-slf4j-impl:jar:2.14.1:compile ``` 解决方法是排除冲突的依赖版本。例如,在 `pom.xml` 中排除旧版本: ```xml <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.17.1</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> ``` #### 3. 验证 Classpath 配置 确保 HiveClasspath 中包含正确的日志库文件。可以通过以下命令验证: ```bash echo $CLASSPATH ``` 如果未包含 Log4j 或 SLF4J 的 JAR 文件,可以手动添加路径。例如: ```bash export CLASSPATH=$CLASSPATH:/path/to/log4j-core-2.x.jar:/path/to/log4j-slf4j-impl-2.x.jar ``` #### 4. 检查 Hive 配置文件 Hive 的日志配置文件 `log4j.properties` 或 `log4j2.xml` 可能也需要调整。确保文件中指定的日志实现与实际加载的库一致。例如: ```properties log4j.rootLogger=INFO, console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{ISO8601} %-5p %c - %m%n ``` 如果使用 Log4j2,则需配置 `log4j2.xml` 文件: ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{ISO8601} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` #### 5. 清理并重新构建项目 完成上述调整后,清理并重新构建项目以确保更改生效: ```bash mvn clean install ``` #### 6. 验证 Hive Metastore 启动 重新启动 Hive Metastore 服务,验证问题是否解决: ```bash nohup hive --service metastore & ``` 如果问题仍然存在,可以通过查看日志文件进一步排查。日志文件通常位于 `/tmp/<username>/hive.log` 或 Hive 安装目录下的 `logs` 文件夹中。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值