【问题标题】:How to choose the scala version for my spark program?如何为我的 spark 程序选择 scala 版本?
【发布时间】:2019-05-19 17:36:17
【问题描述】:

我正在构建我的第一个 Spark 应用程序,使用 IDEA 进行开发。

在我的集群中,Spark的版本是2.1.0,Scala的版本是2.11.8。

http://spark.apache.org/downloads.html 告诉我:“从 2.0 版开始,Spark 默认使用 Scala 2.11 构建。Scala 2.10 用户应下载 Spark 源包并在 Scala 2.10 支持下构建”。

所以这是我的问题:“Scala 2.10 用户应该下载 Spark 源包并使用 Scala 2.10 支持构建”是什么意思?为什么不使用 Scala 2.1.1 的版本?

另一个问题:我可以选择哪个版本的Scala?

【问题讨论】:

  • 欢迎来到 StackOverflow。我们很乐意为您提供帮助。为了提高您获得答案的机会,以下是一些提示:stackoverflow.com/help/how-to-ask
  • Spark 2.0 版不再使用 scala 2.10 构建。如果您想使用 scala 2.10(在您的情况下不是必需的),您必须下载源包并构建它。如果有帮助,请参阅此帖子。 stackoverflow.com/questions/39282434/…

标签: scala apache-spark


【解决方案1】:

首先谈谈“为什么”。

这个主题存在的原因是 scala 版本不(通常说)二进制兼容,尽管大多数时候,源代码是兼容的。

因此,您可以使用 Scala 2.10 source 并将其编译为 2.11.x 或 2.10.x 版本。但是 2.10.x 已编译的二进制文件 (JAR) 不能在 2.11.x 环境中运行。

你可以read more on the subject

Spark 分布

因此,正如您所提到的,Spark 包是为 Scala 2.11.x 运行时构建的。

这意味着您无法在使用 spark.apache.org 构建的 spark 发行版运行的集群/Spark 实例上运行您的 Scala 2.10.x JAR。

可行的是:

  • 您为 scala 2.11.x 编译 JAR 并保持相同的火花
  • 您为 Scala 2.10 重新编译 Spark 并保持 JAR 原样

你有什么选择

为 Scala 2.11 而不是 2.10 编译您自己的 JAR 通常比单独编译 Spark 要容易得多(需要很多依赖才能正确)。

通常,您的 scala 代码是使用 sbt 构建的,并且 sbt 可以针对特定的 scala 版本,例如,请参阅this thread on SO。这是一个指定的问题:

scalaVersion in ThisBuild := "2.10.0"

也可以使用sbt to "cross build",即为不同的scala版本构建不同的JAR。

crossScalaVersions := Seq("2.11.11", "2.12.2")

如何选择 scala 版本

嗯,这是基于“某种”意见的。我的建议是:选择与您的生产 Spark 集群匹配的 scala 版本。

如果您的生产 Spark 是从 https://spark.apache.org/downloads.html 下载的 2.3,那么正如他们所说,它使用 Scala 2.11,这也是您应该使用的。在我看来,使用其他任何东西只会为未来的各种不兼容问题敞开大门。

坚持您的生产需求。

【讨论】:

  • spark 2.0+版本是基于Scala2.11的高版本。如果使用 Scala 2.10 版本,2.11 中新增的一些库在 2.10 中是不存在的。在这种情况下,编译 2.0+ spark。会不会编译不成功?
  • 你说得对,如果你去 2.10(通过重新编译 spark),那么你“添加到混合中”的所有 scala 也必须是 2.10。 2.11 的代码在 2.10 中通常可以正常编译,但你必须重新编译(或查找预编译的 2.10 二进制文件)
猜你喜欢
  • 1970-01-01
  • 2011-03-08
  • 2013-01-12
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 2018-08-31
相关资源
最近更新 更多