我正在尝试通过 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/