为啥 sbt 因 sbt.ResolveException 失败:Spark 2.0.0 和 Scala 2.9.1 的未解决依赖关系?

Posted

技术标签:

【中文标题】为啥 sbt 因 sbt.ResolveException 失败:Spark 2.0.0 和 Scala 2.9.1 的未解决依赖关系?【英文标题】:Why does sbt fail with sbt.ResolveException: unresolved dependency for Spark 2.0.0 and Scala 2.9.1?为什么 sbt 因 sbt.ResolveException 失败:Spark 2.0.0 和 Scala 2.9.1 的未解决依赖关系? 【发布时间】:2017-09-18 23:29:09 【问题描述】:

我正在尝试使用 SBT 使用 spark_submit 运行示例 scala 代码。这是我的 scala 代码 -

import scala.math.random

import org.apache.spark._

/** Computes an approximation to pi */
object SparkPi 
  def main(args: Array[String]) 
    val conf = new SparkConf().setAppName("Spark Pi")
    val spark = new SparkContext(conf)
    val slices = if (args.length > 0) args(0).toInt else 2
    val n = 100000 * slices 
    val count = spark.parallelize(1 to n, slices).map  i =>
      val x = random * 2 - 1
      val y = random * 2 - 1
      if (x*x + y*y < 1) 1 else 0
    .reduce(_ + _)
    println("Pi is roughly " + 4.0 * count / n)
    spark.stop()
  

这是我的 sparksample.sbt 文件 -

name := "Spark Sample"

version := "1.0"

scalaVersion := "2.9.1"

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.0.0"

但是当我运行 SBT 和打包命令时,我得到以下错误

[错误] (*:update) sbt.ResolveException: 未解决的依赖: org.apache.spark#spark-core_2.9.1;2.0.0:未找到

我的 scala 版本是 2.9.1,我的 spark 版本是 2.0.0

我正在关注以下站点以使用 sbt 运行 spark_submit -

https://www.supergloo.com/fieldnotes/apache-spark-cluster-part-2-deploy-a-scala-program-to-spark-cluster/

【问题讨论】:

【参考方案1】:

知道如何推理这个问题很重要,这在 JVM 开发中经常发生。

在关注二进制兼容性的 Scala 生态系统中,依赖项通常使用编译它们的 Scala 版本命名 artifactIds。例如,最新版本的 Spark 有以下坐标:

groupId: 'org.apache.spark'
artifactId: 'spark-core_2.11'
version: '2.1.0'

artifactId 表示此依赖项是使用 Scala 2.11 编译的。

同时,SBT 提供速记,因此您不必将已指定的 Scala 版本附加到 libraryDependencies 中列出的每个依赖项。它通过groupIdartifactId 之间的%% 来实现。 (如果您想明确说明版本,可以使用单个 %,但这在 SBT 用户中并不常见。)

将所有这些放在一起,您在build.sbt 中暗示您的项目具有坐标org.apache.spark:spark-core_2.9.1:2.0.0 的依赖关系。但错误说 SBT 找不到。

当这种情况发生时,有两种可能性。依赖项不存在,或者您需要将它所在的存储库添加到build.sbt。有了像 Spark 这样广泛可用的东西——你可以在documentation 中确认这一点——你会知道 Spark 可以从 Maven Central 获得。正如search for the artifact you specified 所示,它不存在。

那么是时候检查文档以确定您需要哪个工件了。或者,您可以再次检查 Maven Central 或 MVNRepository,我通常更喜欢,以找到可用于您喜欢使用的 Scala 版本 Spark 版本组合的工件。

最后,您会发现 Scala 2.11.x,它不是最新版本的 Scala,但 Spark 使用的最新版本的 Scala 正是您想要的——可能是 2.11。 8.如果您的环境允许,也可以使用最新版本的 Spark,即 2.1.0:

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "2.1.0", 
  "org.apache.spark" %% "spark-sql" % "2.1.0"
)

【讨论】:

【参考方案2】:

未解决的依赖关系:org.apache.spark#spark-core_2.9.1;2.0.0:未找到

Spark 2.0.0 没有基于 Scala 2.9.1 的依赖关系,因此没有错误消息。

sbt 再正确不过了。这篇博文已经超级老了,你最好马上忘记它(我真希望这篇博文不再存在了)。请改用Spark official documentation,最好从Quick Start开始。


快速解决方法是将scalaVersion := "2.9.1" 中的sparksample.sbt 替换为:

scalaVersion := "2.11.8"

你应该没事的。

PROTIPsparksample.sbt 重命名为 build.sbt(你的队友会再次爱你 ;-))

【讨论】:

【参考方案3】:

spark-core 2.0 没有 2.9.1 版本,见https://mvnrepository.com/artifact/org.apache.spark Scala 2.9.1 相当老旧,与 2.10 及更高版本存在许多兼容性问题。您应该至少尝试 Scala 2.10。

【讨论】:

以上是关于为啥 sbt 因 sbt.ResolveException 失败:Spark 2.0.0 和 Scala 2.9.1 的未解决依赖关系?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 SBT 解析 SNAPSHOT 版本?

为啥 SBT 的 Scala (2.10) 不包含 Akka?

为啥 sbt-native-packager 不生成 bin 目录?

为啥在 Play 2.3 项目中 sbt 编译后 sbt 失败并显示 NoClassDefFoundError: play/Play$ in Play 2.2.x 项目?

为啥我的 sbt 项目依赖项不起作用? (坚持尝试远程获取它)

为啥执行“sbt 程序集”失败并显示“不是有效的命令:程序集”?