You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oozie Spark Action执行失败求助:LZ4相关NoSuchMethodError错误

解决Oozie Spark Action中lz4类版本冲突导致的NoSuchMethodError

这个错误我之前帮不少用户排查过,核心原因是lz4类库的版本冲突——JVM找到了LZ4BlockInputStream类,但找不到带(InputStream, boolean)参数的构造方法,说明加载的是一个旧版本的lz4 jar,而非你Spark应用依赖的1.3.0版本。

为什么spark-submit正常但Oozie执行失败?因为spark-submit默认优先使用Spark安装目录下的依赖jar,而Oozie运行时会把系统共享库(包括Hadoop、Oozie自身的依赖)加入classpath,这些库可能包含更早版本的lz4,覆盖了Spark的正确版本。

下面是几个可行的解决方案,按推荐优先级排序:

方案一:强制指定Spark依赖的lz4 jar路径

在你的workflow.xml的<spark-opts>中添加classpath参数,指定EMR集群上Spark自带的lz4 jar路径(EMR 5.13.0的Spark jars默认路径是/usr/lib/spark/jars/):

<spark-opts>--driver-memory 512m --executor-memory 512m --num-executors 1 
--driver-class-path /usr/lib/spark/jars/lz4-1.3.0.jar 
--conf spark.executor.extraClassPath=/usr/lib/spark/jars/lz4-1.3.0.jar</spark-opts>

这个方法能强制Spark Driver和Executor优先加载官方的lz4 1.3.0版本,避免系统库的旧版本干扰,且不会影响其他Oozie应用。

方案二:调整Oozie启动器的classpath优先级

在workflow.xml的<configuration>块中添加以下属性,让用户上传的jar依赖优先于系统共享库加载:

<property>
  <name>oozie.launcher.mapreduce.job.classpath.user.precedence</name>
  <value>true</value>
</property>

同时,确保你的应用jar(tss-assembly-1.0.jar)中包含正确版本的lz4-1.3.0.jar(打包时不要排除这个依赖),或者把lz4-1.3.0.jar和主jar放在同一个HDFS目录下。

方案三:清理Oozie共享库中的冲突jar

检查Oozie共享库的Spark目录(/user/oozie/share/lib/lib_20180517102659/spark),如果存在多个lz4版本的jar(比如lz4-1.2.0.jar和lz4-1.3.0.jar),删除旧版本的jar,只保留lz4-1.3.0.jar。

⚠️ 注意:这个方法可能会影响其他使用Oozie Spark Action的应用,建议先在测试环境验证后再操作。

额外排查步骤

如果不确定哪个jar在引发冲突,可以查看Oozie Launcher的日志,搜索关键词lz4,找到类似Loaded from: /path/to/lz4.jar的条目,确认加载的是不是旧版本的lz4 jar。

内容的提问来源于stack exchange,提问作者PPPP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:21:32