几天前,我们从DSE 4.6升级到DSE 4.7。我们正在从Java运行Spark作业,所以我将spark-core_2.10
Maven依赖从0.9.1
升级到1.2.2
,以支持DSE捆绑的新的Spark 1.2.2。但是,当我现在提交作业以掌握日志时
ERROR [sparkMaster-akka.actor.default-dispatcher-2] 2015-11-17 17:50:42,442 Slf4jLogger.scala:66 - org.apache.spark.deploy.ApplicationDescription; local class incompatible: stream classdesc serialVersionUID = 7674242335164700840, local class serialVersionUID = 2812534333379744973
java.io.InvalidClassException: org.apache.spark.deploy.ApplicationDescription; local class incompatible: stream classdesc serialVersionUID = 7674242335164700840, local class serialVersionUID = 2812534333379744973
[...]
(请参阅此处的完整例外:https://gist.github.com/JensRantil/371d00701ff7f2021d7d)
进一步深入研究,结果是DSE附带了spark-core_2.10-1.2.2.2.jar
serialVersionUID
org.apache.spark.deploy.ApplicationDescription
spark-core_2.10-1.2.2.jar
不同的1.2.2
运送<{1}}。我已使用serialver
验证了这一点。问题: Datastax Java Spark documentation从未提及有关导入Spark Core的任何内容。 我是否可以在DSE中使用标准的Spark Java Maven工件?
Additionals:
dse.jar
添加到类路径中,这不是问题。ApplicationDescription
类未固定其serialVersionUID
。对ApplicationDescription.class
和1.2.2
的{{1}}进行反编译,看起来它们都使用相同数量的字段但具有不同的方法,这会导致1.2.2.2
以不同方式生成。一个潜在的上游DSE修复方法是简单地将serialVersionUID
固定为serialVersionUID
。7674242335164700840
以遮蔽破坏我们应用程序的包。但是,即使我们没有spark-core_2.10-1.2.2.jar
的源代码,我们也可以使用Maven shade plugin。