为什么sbt会失败并出现sbt.ResolveException:Spark 2.0.0和Scala 2.9.1的未解析依赖项?

时间:2017-04-21 20:32:10

标签: scala apache-spark sbt

我尝试使用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和包命令时我得到以下错误

  

[error](*:update)sbt.ResolveException:未解析的依赖项:   org.apache.spark#spark-core_2.9.1; 2.0.0:not found

我的scala版本 2.9.1 ,我的火花版本 2.0.0

我跟随以下网站使用sbt -

运行spark_submit

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

3 个答案:

答案 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"

你应该没事。

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

答案 1 :(得分:2)

知道如何解决这个问题很重要,这个问题经常发生在JVM上。

在Scala生态系统中,二进制兼容性是一个问题,依赖关系通常会使用编译的Scala版本命名artifactId。例如,最新版本的Spark具有以下坐标:

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

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

同时,SBT提供速记,因此您不必将已经指定的Scala版本附加到libraryDependencies中列出的每个依赖项。它通过%%groupId之间的artifactId来实现。 (如果您想明确版本,可以使用单个%,但这在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 :(得分:0)

没有2.9.1版本的spark-core 2.0,请参阅https://mvnrepository.com/artifact/org.apache.spark Scala 2.9.1非常陈旧,与2.10及更高版本存在许多兼容性问题。你应该至少尝试Scala 2.10。