Oozie运行Spark任务时Guava版本冲突问题排查
从错误栈最底层的java.lang.IllegalAccessError可以明确看出问题根源:BoneCP连接池尝试调用Guava的MapMaker.makeComputingMap方法时出现权限访问异常,这本质还是Guava版本冲突——尽管你已经确认了自身Jar包和Oozie共享库用的是14.0,但集群环境里还有不少容易被忽略的位置可能引入不兼容的Guava版本,下面逐一梳理:
可能引入冲突Guava版本的位置
- Hadoop/Yarn核心类路径:Hadoop本身的依赖库(比如
$HADOOP_HOME/share/hadoop/common/lib、$HADOOP_HOME/share/hadoop/hdfs/lib)通常会自带Guava。Oozie提交Yarn任务时,会默认把Hadoop的类路径注入到任务的类加载器中,如果这里的Guava版本和14.0不一致,会被优先加载覆盖你的版本。 - Hive安装目录的依赖:因为你的任务需要初始化HiveContext,Hive的
$HIVE_HOME/lib目录下的Guava Jar会被自动加载。很多Hive版本(比如Hive 1.2+)默认使用的Guava版本高于14.0,这会和你依赖的14.0版本产生冲突。 - Oozie工作流的额外依赖:如果你的Oozie workflow.xml里通过
<file>、<archive>或者<lib>标签引入了其他第三方Jar,这些Jar可能直接包含不同版本的Guava,或者它们的依赖树中间接引入了Guava(比如某些数据处理库)。 - Yarn应用级类加载配置:Yarn的
yarn.application.classpath配置项定义了全局应用的类路径优先级,如果系统默认的类路径里包含了非14.0的Guava,且优先级高于你指定的Jar,就会导致冲突。 - Spark客户端的内置依赖:虽然你用本地
spark-submit运行正常,但Oozie调用Spark时可能使用的是集群上的Spark客户端(而非你本地的)。可以检查Oozie集成的Spark共享库之外,$SPARK_HOME/jars目录下的Guava版本是否和14.0一致。 - 全局系统类路径:部分集群会将通用依赖Jar配置到系统级的
CLASSPATH环境变量中,如果这里存在不同版本的Guava,也会被任务加载。
排查与解决建议
- 确认实际加载的Guava版本:在你的Spark代码中加入打印逻辑,输出当前加载的Guava版本和完整类路径:
提交任务后查看日志,就能精准定位到冲突Jar的来源。// 打印Guava版本 println("Loaded Guava version: " + com.google.common.util.concurrent.MoreExecutors.class.getPackage().getImplementationVersion()) // 打印完整类路径 println("Current classpath: " + System.getProperty("java.class.path")) - 调整类加载优先级:在Oozie的workflow.xml中添加配置,让用户自定义Jar优先于系统Jar加载:
<property> <name>oozie.launcher.mapreduce.job.user.classpath.first</name> <value>true</value> </property> - 隔离冲突依赖:如果无法修改集群全局依赖,可以在任务打包时使用Maven Shade插件重命名Guava的包名,避免类路径上的版本冲突。
- 检查Hive元数据配置:查看Hive的
hive-site.xml中的hive.metastore.client.class.path参数,确保没有指定额外的Guava Jar路径。
内容的提问来源于stack exchange,提问作者LubaT
相关产品推荐
相关产品推荐

