2017-05-04 46 views
0

我有一个Spark程序,它需要几个依赖项。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设置,但还有另外一个问题。在我的userClassPath中有一个“秘密”jar文件,比如说“b.jar”,它不适用于集群,并且存在如此多的依赖关系,我不知道哪个jar不起作用。

综上所述:

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

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

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

回答

1

Uber Jar使用shade plugin创建可以是您的解决方案。 Uber jar正在收集您包装的罐子中的所有相关罐子,以便我们不会发生冲突。我们可以用shade plugin重新定位/重命名冲突的罐子。有更多的优点。可以找到更多的信息herehere

1

最好的解决方案是海事组织:

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

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