我有一个需要多个依赖项的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)
我希望有人可以告诉我,这里最好的解决办法是什么,以尽量减少工作。
答案 0 :(得分:2)
Uber Jar
创建 shade plugin
可以成为您的解决方案。 Uber jar
正在收集打包jar中的所有依赖jar,以便我们不会发生冲突。我们可以使用shade plugin
重新定位/重命名冲突的jar。还有更多优点。可以找到更多信息here和here
答案 1 :(得分:1)
最好的解决方案是IMO:
使用包管理器或您想要使用的任何其他工具获取依赖关系树。例如,在maven中,您可以使用mvn dependency:tree
see here来仔细检查哪些依赖项可能导致类路径错误,并通过在构建文件定义中排除它们来删除它们,如it is pointed out here。
然后,重建您的JAR并再次尝试。