java.lang.LinkageError: loader constraint violation when resolving method "org.slf4j.impl.StaticLogg

本文针对Spark部署中出现的java.lang.LinkageError异常进行详细解析,介绍了Spark依赖包加载顺序及解决版本冲突的方法,并提供了查看实际使用版本的具体步骤。

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

最近部署spark应用时抛出以下异常: 

Exception in thread "Driver" java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/apache/spark/util/ChildFirstURLClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for the method's defining class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature
	at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:335)
	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:283)
	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:304)
	at com.coupang.fds.detection.OrderDetectionStreaming.<clinit>(OrderDetectionStreaming.java:31)
	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.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:645)

根据以前的总结:

spark依赖包加载顺序总结:

  1. 默认情况下,spark优先使用/etc/spark/conf/classpath.txt里自带的依赖包;
  2. 若是找不到则查找用户通过 --jar 提交的依赖包(位于driver、executor的classpath里);
  3. 若是两个路径下都有相同名字的依赖包(版本不同),则抛出java.lang.LinkageError用户解决冲突;
  • 使用 --spark.{driver,executor}.userClassPathFirst = true 优先启用用户提供的依赖包;
  • 使用 --spark.{driver,executor}.extraClassPath = conflict-jar 来解决同名冲突的包依赖;

解决冲突的方式有两种,第一种是用户在使用--jars引入的时候不引入。第二种时必须引入新的版本的包时采用--spark.{driver,executor}.extraClassPath属性优先加载解决冲突。

 

可以知道上面的问题是slf4j的版本冲突问题,具体查看是哪个版本冲突。

TIPS:

查看具体使用的是哪个版本方法:spark-submit 的时候添加

--driver-java-options -verbose:class

 

参考文章:

https://blog.youkuaiyun.com/adorechen/article/details/80109625

https://blog.youkuaiyun.com/adorechen/article/details/80110272

https://spark.apache.org/docs/latest/submitting-applications.html#advanced-dependency-management

java.lang.LinkageErrorloader constraint violation: when resolving method解释为加载器约束错误:在解析方法时。 当Java虚拟机(JVM)在运行时尝试加载类和解析类中的方法时,可能会遇到该错误。这通常发生在以下情况下: 1. 类型冲突:加载器尝试使用两个不同的类加载器加载具有相同名称但不同版本的类,从而导致了方法的冲突。因此,使用了不兼容的类定义。 2. 类重定义:加载器尝试重新定义已经在虚拟机中加载的类,从而导致加载的重复。这可能会导致类的冲突以及方法无法解析。 解决这个问题的方法如下: 1. 检查类加载器:确定是否有多个类加载器同时加载了相同的类。如果是,请确保只有一个类加载器加载相应的类。 2. 更新依赖关系:检查项目的依赖关系,确保所有的依赖项都是最新的版本并且兼容。 3. 清除类缓存:如果问题仍然存在,可以尝试清除JVM的类缓存。可以通过删除临时目录中的所有缓存文件来实现(例如,Java.io.tmpdir系统属性指向的目录)。 4. 更新JVM:确保使用的JVM是最新版本。有时,这种错误可能是由于JVM本身的问题引起的,而在较新的版本中可能已经修复。 总之,加载器约束错误是由于类加载器冲突或类重定义导致的,解决方法包括检查类加载器、更新依赖关系、清除类缓存以及更新JVM版本等。根据具体情况选择适当的解决方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值