当前位置: 首页 > 知识库问答 >
问题:

如何选择我的火花程序的scala版本?

傅胡媚
2023-03-14

我正在构建我的第一个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?

共有1个答案

缑勇锐
2023-03-14

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

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

你可以阅读更多关于这个主题的文章。

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

这意味着您不能在集群/Spark实例上运行您的Scala 2.10. x JAR,该集群/Spark实例运行spark.apache.org构建的Spark分布。

有效的方法是:

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

为Scala 2.11而不是2.10编译您自己的JAR通常比编译Spark本身要容易得多(要获得正确的结果,需要大量依赖项)。

通常,scala代码是用sbt构建的,sbt可以针对特定的scala版本,例如,请参见此线程等等。这是一个具体说明的问题:

scalaVersion in ThisBuild := "2.10.0"

您还可以使用sbt“交叉构建”,即为不同的scala版本构建不同的JAR。

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

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

如果您的产品Spark是从https://spark.apache.org/downloads.html,然后正如他们所说,它使用Scala 2.11,这也是您应该使用的。在我看来,使用其他任何东西都会为以后的各种不兼容敞开大门。

坚持你的生产需要。

 类似资料:
  • 嗨,我正在尝试生成Salt示例的输出,但没有使用文档中提到的docker。我找到了帮助生成输出的scala代码,这是main.scala。我将main.scala修改为一个方便的main.scala, 我为这个scala创建了一个单独的文件夹, calac-cp“lib/salt.jar:lib/spark.jar”main.scala 这已成功运行并在文件夹BinexTest下生成类。 现在,项

  • 当我使用spark-submit with master yarn和deploy-mode cluster提交spark作业时,它不会打印/返回任何applicationId,一旦作业完成,我必须手动检查MapReduce jobHistory或spark HistoryServer来获取作业细节。 我的集群被许多用户使用,在jobHistory/HistoryServer中找到我的作业需要很多时

  • 当我运行Spark Scala程序时,有一个“Task not serializable”异常 Spark RDD是不可串行化类型(java类) 调用的函数来自不可序列化的类(java类,再次) 我的代码是这样的 我注意到我可以用 但对于RDD中的对象类,我仍然会遇到这个例外。我会以另一种方式,也会以另一种方式,也就是第二部分,因为我不想创建大量PredicateClass的对象。 你能帮我吗?我

  • 我目前正在使用上面的UDF将一列字符串解析成一个键和值的数组。“50:63.25,100:58.38”到[[50,63.2],[100,58.38]]。在某些情况下,字符串是“\N”,我无法解析列值。如果字符串是“\N”,那么我应该返回一个空数组。有人能帮我处理这个异常或帮我添加一个新的案例吗?我是spark-scala的新手。 错误:scala.MatchError:[Ljava.lang.St

  • 问题内容: 我在选择主键时发现了此阅读材料。 是否有关于如何为给定表选择主键的指南/博客文章? 我应该使用自动递增/生成的密钥,还是应该将主密钥基于要建模的数据(假设它具有真正唯一的字段)? 出于性能考虑,主键是否应该总是很长,或者即使它是字符串,我也可以将外部唯一ID作为主键吗? 问题答案: 我相信在实践中使用自然键很少比代理键好。 以下是使用自然键作为主键的主要缺点: 您可能有不正确的键值,或

  • 我正在尝试 https://github.com/apache/spark/blob/v2.0.1/examples/src/main/scala/org/apache/spark/examples/sql/streaming/StructuredNetworkWordCountWindowed.scala 个例子。 但是,指定端口号处的输入应该是什么?