Apache spark sbt:在不破坏依赖关系的情况下使用本地jar

Apache spark sbt:在不破坏依赖关系的情况下使用本地jar,apache-spark,sbt,apache-spark-mllib,Apache Spark,Sbt,Apache Spark Mllib,我正在构建一个使用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()

我正在构建一个使用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中的代码,并将其重新编译到名为spark-mllib_2.10-1.6.0.jar的jar中
  • 将上述jar放入项目的lib目录中
  • 还将spark-core_2.10-1.6.0.jar放入项目的lib目录中
  • 删除build.sbt文件中的libraryDependencies语句
  • 运行sbt清洁包
  • 但是,由于缺少spark core和spark mllib运行所需的依赖项,因此无法编译。只有在build.sbt文件中写入libraryDependencies语句时,sbt才会自动管理这些依赖项

    因此,我将libraryDependencies语句放回build.sbt中,希望sbt能够解决依赖性问题,并且仍然使用本地spark mllib,而不是来自远程存储库的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-命名为“spark-mllib_2.10-1.6.0.jar”
    以确保我的系统上不存在其他jar

    一种方法是将自定义mlib作为非托管依赖项。 非托管依赖项放在一个目录中,SBT将按原样提取它们,因此您还负责提供它们的依赖项。 您可以在此处阅读有关非托管依赖项的内容:

    因此,您可以尝试以下方法:

  • 创建一个
    lib
    目录,并在那里添加自定义的mlib jar。这是非托管LIB的默认位置,sbt将自动拾取它
  • 在build.sbt中,删除对mlib的引用,并添加其所有依赖项,这些依赖项列在pom中,如下所示:。您可以跳过具有测试范围的测试

  • 另一种方法是拥有自己的maven repo(artifactory),将自定义工件放置在何处,并让sbt首先从该存储库中提取。这样做的好处是,其他人可以构建代码并使用自定义mlib库。

    一种方法是将自定义mlib作为非托管依赖项。 非托管依赖项放在一个目录中,SBT将按原样提取它们,因此您还负责提供它们的依赖项。 您可以在此处阅读有关非托管依赖项的内容:

    因此,您可以尝试以下方法:

  • 创建一个
    lib
    目录,并在那里添加自定义的mlib jar。这是非托管LIB的默认位置,sbt将自动拾取它
  • 在build.sbt中,删除对mlib的引用,并添加其所有依赖项,这些依赖项列在pom中,如下所示:。您可以跳过具有测试范围的测试

  • 另一种方法是拥有自己的maven repo(artifactory),将自定义工件放置在何处,并让sbt首先从该存储库中提取。这样做的好处是,其他人可以构建代码并使用您的自定义mlib库。

    非常感谢。但我认为unmanagedBase:=baseDirectory.value/“custom_lib”仅在我想使用lib以外的目录来承载我的自定义jar时使用?是的,对不起,这是一个错误的复制和粘贴,我更正了它。您不需要添加“custom_lib”,我想指出的是保存mlib所有依赖项的pom。我使用了第一种方法,但自定义jar似乎仍然没有被使用,我已经用新的build.sbt文件更新了我的帖子。非常感谢。但我认为unmanagedBase:=baseDirectory.value/“custom_lib”仅在我想使用lib以外的目录来承载我的自定义jar时使用?是的,对不起,这是一个错误的复制和粘贴,我更正了它。您不需要添加“custom_lib”,我想指出保存mlib所有依赖项的pom。我使用了第一种方法,但自定义jar似乎仍然没有被选中,我已经用新的build.sbt文件更新了我的帖子。