Spark程序中版本冲突的最佳解决方案

时间:2017-05-04 19:02:29

标签: scala apache-spark jar version-control

我有一个需要多个依赖项的Spark程序。

一个依赖项:a.jar是集群a_2.8.jar上的2.8版本,但是,我需要使用其版本2.9,a_2.9.jar

每次启动程序时,spark都会自动从群集加载a_2.8.jar,而不是加载a_2.9.jar,即使我已经通过--jars a_2.9.jar提交了这个jar。

我尝试使用spark.executor.userClassPathFirst设置,但还有另一个问题。有一个"秘密" jar文件,说" b.jar",在我的userClassPath中,它不能与集群一起工作,并且有很多依赖项,我不知道哪个jar没有#&# 39; t工作。

总结一下:

如果我使用群集默认类路径,a.jar将发生冲突。

如果我使用userClassPathFirst,则b.jar会发生冲突。 (我不知道哪个b.jar)

我希望有人可以告诉我,这里最好的解决办法是什么,以尽量减少工作。

2 个答案:

答案 0 :(得分:2)

使用Uber Jar创建

shade plugin可以成为您的解决方案。 Uber jar正在收集打包jar中的所有依赖jar,以便我们不会发生冲突。我们可以使用shade plugin重新定位/重命名冲突的jar。还有更多优点。可以找到更多信息herehere

答案 1 :(得分:1)

最好的解决方案是IMO:

使用包管理器或您想要使用的任何其他工具获取依赖关系树。例如,在maven中,您可以使用mvn dependency:tree see here来仔细检查哪些依赖项可能导致类路径错误,并通过在构建文件定义中排除它们来删除它们,如it is pointed out here

然后,重建您的JAR并再次尝试。