Flume错误:Flume:Class path contains multiple SLF4J bindings

本文介绍了解决Flume启动时出现的SLF4J多重绑定问题的方法。当Flume和Hadoop中同时存在不同版本的SLF4J时,会导致程序启动失败。文章给出了具体的解决方案,即删除或重命名冲突的SLF4J jar包。

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

Class path contains multiple SLF4J bindings.

启动 Flume 时,会看到如下内容:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/flume-1.9.0/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop-2.7.7/share/hadoop/common/lib/slf4j-log4j12-1.7.10.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]

错误内容:

启动 Flume 时,找到了多个 SLF4J bindings(绑定),SLF4J 如同 log4j 一样,是打印日志的工具。

Found binding in...,在加载 jar 包时,找到了两个本版本不同的 SLF4J,导致了程序出错。

错误原因:

启动 Flume 时,在 /flume-1.9.0 目录下找到了 SLF4J,又在 /hadoop-2.7.7 目录下找到了 SLF4J。

由于 Flume 是 Hadoop 生态的一个日志采集工具,所以当启动 Flume 后,Flume 就会去加载 Hadoop_HOME 中的类,所以启动时可以看到加载了许多 Hadoop 下的包,当 SLF4J 时,在 Flume 自己目录下也有 SLF4J,就导致了类的冲突,而且版本不一样。

解决办法:

在提示中的路径下,对 Flume 的 SLF4J 删除或重命名。

比如:将该 jar 包重命名为 .jar.bak 结尾的文件,bak 表示 backup(备份)。

mv /opt/flume-1.9.0/lib/slf4j-log4j12-1.7.25.jar /opt/flume-1.9.0/lib/slf4j-log4j12-1.7.25.jar.bak

重启 Flume就没有该错误了。

### 解决 Hive 中 SLF4J 多版本冲突 SLF4J(Simple Logging Facade for Java)是一个流行的日志记录框架抽象层。当在 Hive 的环境中运行时,如果类路径中存在多个不同版本的 SLF4J JAR 文件,则可能会引发 `SLF4J: Class path contains multiple SLF4J bindings` 错误[^1]。 此错误通常表明有多个实现绑定被加载到同一个应用程序上下文中。以下是处理此类问题的方法: #### 方法一:移除多余的 SLF4J 实现 通过检查 Hive 和其依赖库中的 lib 目录,定位并删除冗余的 SLF4J 绑定文件。例如,在 HadoopFlume 环境下可能已经包含了某些特定版本的 Guava 库或其他第三方库,这些库可能导致冲突。可以参考如下命令来清理不必要的 jar 文件: ```bash [hadoop@hadoop102 module]$ find /opt/module/ -name "*.jar" | grep slf4j ``` 上述命令可以帮助找到所有与 SLF4J 相关的 jar 文件位置。一旦发现重复项,可以选择保留最新或者最匹配当前环境需求的一个版本,并将其余版本删除。例如: ```bash rm /opt/module/hive/lib/slf4j-log4j12-*.jar ``` #### 方法二:强制指定单一 SLF4J 版本 另一种方法是在启动脚本或配置文件中显式设置所需的 SLF4J 版本号。可以通过调整 CLASSPATH 变量的方式完成这一操作。比如编辑 `$HIVE_HOME/conf/hive-env.sh` 并加入以下内容: ```bash export HADOOP_CLASSPATH=/path/to/correct-version-of-slf4j.jar:$HADOOP_CLASSPATH ``` 这样能够确保只有预定义好的那个版本会被加载入内存之中参与执行过程。 #### 方法三:利用 Maven 构建工具管理依赖关系 如果是基于项目源码重新编译部署的话,还可以借助像 Apache Maven 这样的构建管理系统自动解析和排除冲突性的依赖项。只需修改 pom.xml 配置文档内的 `<dependencyManagement>` 节点即可达成目标。下面给出一段示范代码片段用于说明如何统一整个工程内部所使用的 logging framework 类型及其具体发行版次序: ```xml <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.30</version> </dependency> <!-- Exclude conflicting transitive dependencies --> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*log*</artifactId> </exclusion> </exclusions> ``` 以上三种方式都可以有效缓解甚至彻底消除因多版本共存而引起的异常状况发生概率。实际应用过程中可以根据具体情况灵活选用最适合自己的解决方案。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOEL-T99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值