我正在构建一个使用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-core和spark-mllib运行所需的依赖关系,因此无法编译,只有当libraryDependencies的语句写入build文件时,依赖关系才会自动由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。
答案 0 :(得分:0)
一种方法是将自定义mlib作为非托管依赖项。 非托管依赖项放在一个目录中,SBT将按原样接收它们,因此您还有责任提供它们的依赖项。 您可以在此处阅读有关非托管依赖项的信息:http://www.scala-sbt.org/0.13/docs/Library-Dependencies.html
所以,您可以尝试以下方法:
lib
目录并在那里添加自定义mlib jar。这是非托管lib的默认位置,sbt会自动将其选中另一种方法是拥有自己的maven repo(artifactory)放置自定义工件的位置,并首先从该存储库获取sbt。这样做的好处是,其他人将能够构建代码并使用您的自定义mlib库。