【发布时间】:2016-05-13 03:38:33
【问题描述】:
我正在构建一个使用 Spark 和 Spark-mllib 的应用程序,build.sbt 将依赖项声明如下:
3 libraryDependencies ++= Seq(
4 "org.apache.spark" %% "spark-core" % "1.6.0" withSources() withJavadoc(),
5 "org.apache.spark" %% "spark-mllib" % "1.6.0" withSources() withJavadoc()
6 )
这很好用。现在我想更改 mllib 中的一些代码并使用 sbt 重新编译应用程序,这就是我所做的:
- 下载spark-1.6.0的源代码,修改mllib中的代码,重新编译成一个jar,名为spark-mllib_2.10-1.6.0.jar
- 将上述jar放入项目的lib目录中。
- 同样将spark-core_2.10-1.6.0.jar放到项目的lib目录下。
- 删除 build.sbt 文件中的 libraryDependencies 语句。
- 运行 sbt clean package
但是,由于缺少 spark-core 和 spark-mllib 运行所需的依赖项,因此无法编译,仅当 libraryDependencies 的语句写入 build.xml 文件时,sbt 才会自动管理依赖项。 sbt.
所以我将 libraryDependencies 的声明放回 build.sbt 中,希望 sbt 能够解决依赖问题,并且仍然使用本地 spark-mllib 而不是来自远程存储库的那个。但是,运行我的应用程序表明情况并非如此。
所以我想知道是否有办法在不手动解决依赖问题的情况下使用我的本地 spark-mllib jar?
更新: 我遵循了 Roberto Congiu 回答的第一种方法,并使用以下 build.sbt 成功构建了包:
1 lazy val commonSettings = Seq(
2 scalaVersion := "2.10.5",
3 libraryDependencies ++= Seq(
4 "org.apache.spark" %% "spark-core" % "1.6.0" withSources() withJavadoc(),
5 "org.apache.spark" %% "spark-streaming" % "1.6.0" withSources() withJavadoc(),
6 "org.apache.spark" %% "spark-sql" % "1.6.0" withSources() withJavadoc(),
7 "org.scalanlp" %% "breeze" % "0.11.2"
8 )
9 )
10 lazy val core = project.
11 settings(commonSettings: _*).
12 settings(
13 name := "xSpark",
14 version := "0.01"
15 )
16
17 lazy val example = project.
18 settings(commonSettings: _*).
19 settings(
20 name := "xSparkExample",
21 version := "0.01"
22 ).
23 dependsOn(core)
xSparkExample 包含一个调用 xSpark 的 KMeans 示例,xSpark 调用 spark-mllib 中的 KMeans 函数。这个 spark-mllib 是一个自定义的 jar,我把它放在 core/lib 目录中,以便 sbt 可以将它作为本地依赖项来获取。
但是,由于某种原因,运行我的应用程序仍然没有使用自定义的 jar。我什至使用find . -name "spark-mllib_2.10-1.6.0.jar" 来确保我的系统上不存在其他 jar。
【问题讨论】:
标签: apache-spark sbt apache-spark-mllib