使用Scala 2.12与Spark 2.x

29
在Spark 2.1 文档 中提到:

Spark运行在Java 7+,Python 2.6+/3.4+和R 3.1+上。对于Scala API,Spark 2.1.0使用Scala 2.11。您需要使用兼容的Scala版本(2.11.x)。

在Scala 2.12 发布新闻 中也提到:

虽然Scala 2.11和2.12大部分是源代码兼容的,以方便交叉构建,但它们不是二进制兼容的。这使我们能够不断改进Scala编译器和标准库。

但是,当我使用Scala 2.12构建一个uber jar并在Spark 2.1上运行时,一切都很正常。
我知道这不是任何官方来源,但在47度博客中提到,Spark 2.1确实支持Scala 2.12。
如何解释那些(冲突的?)信息呢?

有一个正式的区别,即“我们支持那个版本,我们已经测试过了,如果你遇到问题,那就是我们这边的 bug”,与“按照你自己的方式去做,如果你想尝试实验,但如果你遇到问题,就不要来抱怨了”的区别。 - Samson Scharfrichter
是的,但如果Scala 2.11与2.12不具有二进制兼容性,它如何运作? - NetanelRabinowitz
1
不兼容意味着至少存在一个问题。对于99.99%的API调用可能是可以的。你使用自定义的Uber-JAR进行了多少测试?也许只有15%? - Samson Scharfrichter
https://dev59.com/xF7Fs4gBPY-HTNNj3kfn - Dmytro Mitin
3个回答

38

Spark 不支持 Scala 2.12。您可以关注 SPARK-14220构建和测试 Spark 对 Scala 2.12 的支持),以获取最新状态。

更新: Spark 2.4 新增了实验性的 Scala 2.12 支持。


2
可以作为注释添加。 - jjj
3
Spark 2.4现在支持实验性的Scala 2.12。 - Maziyar
2
2.12支持已不再是实验性的 - 现在是GA - 请参阅Spark 2.4.1发布说明 - George Hawkins
尽管Scala 2.12可能得到支持,但是截至Spark 2.4.x预构建的二进制文件是使用Scala 2.11编译的(除了版本2.4.2)。 - ecoe

4

Scala 2.12是Spark 3官方支持和要求的版本。摘要:

  • Spark 2.0 - 2.3: 要求Scala 2.11
  • Spark 2.4: 支持Scala 2.11和Scala 2.12,但实际上几乎所有运行时都只支持Scala 2.11。
  • Spark 3: 只支持Scala 2.12

使用一个与JAR文件编译版本不同的Spark运行时是危险的,会导致奇怪的错误。例如,如此处所述,使用在Scala 2.11下编译的JAR文件在Spark 3集群上运行将导致此错误:java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)Lscala/collection/mutable/ArrayOps

请看这里的所有不幸的Spark用户遇到了这个错误。

确保了解Scala交叉编译并理解SBT中的%%操作符以限制您的痛苦。维护Scala项目很困难,建议尽量减少依赖关系。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接