java - 强制 java jar 在 EMR 上不使用类路径包

标签 java scala sbt classpath amazon-emr

我正在尝试通过 EMR 上的 spark-submit 运行一个 fat jar。我遇到了与包依赖性相关的问题。该项目依赖于我已包含在 build.sbt 中的 google adwords 库。问题是 google adwords 库内部依赖于一个名为 commons-configuration 版本 1.10 的软件包,但是当我通过 spark-submit 在 EMR 上运行此 jar 时> 通过 yarn Scheduler 运行此包的 1.6 版 (commons-configuration),因为它是 EMR 集群上 CLASSPATH 的一部分。我收到以下错误

java.lang.NoSuchMethodError:org.apache.commons.configuration.MapConfiguration

我尝试使用 spark-submit 的选项 --jars 显式传递依赖项 jar

spark-submit --name my-awesome-spark-job --deploy-mode cluster --class package.path.to.my.Main --jars s3://jar-bucket/jars/commons-configuration-1.10.jar s3://code-bucket/jars/spark-code.jar

无论如何,这样做仍然会给我带来与使用 CLASSPATH 中旧版本的包相同的错误。 我想强制我的 jar 将依赖项包含在 fat jar 中,并显式地将它们用于某些库,例如此处的 google adwords 库。谢谢。

最佳答案

您可以尝试隐藏正在使用的且集群上有旧版本的依赖项。

你用什么来构建这个 jar ?我已经在 sbt 中使用了这个策略 https://github.com/sbt/sbt-assembly#shading

但是还有一个maven的shade插件:https://maven.apache.org/plugins/maven-shade-plugin/

关于java - 强制 java jar 在 EMR 上不使用类路径包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56253219/

相关文章:

java - 使用 JoiObject Mapper 时出现问题

java - 如何使用 java.util.regex.* 执行部分匹配?

Scala Lift - 如何启动项目

java - 如何在 XPath 中处理方括号

java - 使用 junit 进行迭代测试

scala - SBT:在不发布的情况下依赖其他 SBT 项目

java - IntelliJ Build 不执行 sbt 'compile' 依赖

playframework - 在运行时使用 build.sbt 中的 javaOptions

scala - Redis 中的 "Null reply"到底是什么?

scala - 尝试使用 Scala + Spark 构建独立应用程序时出现 Unresolved 依赖项错误