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

Force java jar to not use classpath packages on EMR

我正在尝试通过 spark-submit 在 EMR 上 运行 一个胖罐。我正在 运行 解决与包依赖性相关的问题。这个项目依赖于我在 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/