为啥 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 版本命名 artifactId
s。例如,最新版本的 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】:未解决的依赖关系: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
(你的队友会再次爱你 ;-))
【讨论】:
【参考方案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 的 Scala (2.10) 不包含 Akka?
为啥 sbt-native-packager 不生成 bin 目录?
为啥在 Play 2.3 项目中 sbt 编译后 sbt 失败并显示 NoClassDefFoundError: play/Play$ in Play 2.2.x 项目?