14

我使用spark(在java API中)并且需要一个可以推送到集群的jar,但是jar本身不应该包含spark。部署作业的应用程序当然应该包括 spark。

我想:

  1. sbt run - 一切都应该被编译和执行
  2. sbt smallAssembly - 创建一个没有火花的罐子
  3. sbt assembly - 创建一个包含所有内容(包括 spark)的 uber jar,以便于部署。

我有 1. 和 3. 工作。关于我如何 2. 的任何想法?我需要将什么代码添加到我的 build.sbt 文件中?

这个问题不仅与火花有关,还与我可能希望排除的任何其他依赖关系有关。

4

2 回答 2

29

%“提供”配置

从胖 jar 中排除 jar 的第一个选项是"provided"对库依赖项使用配置。"provided"来自 Maven提供的范围,定义如下:

这很像compile,但表示您希望 JDK 或容器在运行时提供依赖项。例如,在为 Java 企业版构建 Web 应用程序时,您可以将 Servlet API 和相关 Java EE API 的依赖设置为范围provided,因为 Web 容器提供了这些类。此范围仅在编译和测试类路径上可用,并且不可传递。

由于您将代码部署到容器(在本例中为 Spark),因此与您的评论相反,您可能需要 Scala 标准库和其他库 jar(例如,如果您使用了 Dispatch)。这不会影响runtest

包装箱

如果你只想要你的源代码,而不需要 Scala 标准库或其他库依赖项,那将被packageBin内置到 sbt 中。这个打包的 jar 可以与您可以使用 sbt-assembly 制作的仅依赖 jar 结合使用assemblyPackageDependency

组装中的排除罐子

最后的选择是使用excludedJars in assembly

excludedJars in assembly := {
  val cp = (fullClasspath in assembly).value
  cp filter {_.data.getName == "spark-core_2.9.3-0.8.0-incubating.jar"}
}
于 2013-11-22T01:51:09.540 回答
7

对于像我这样的初学者,只需添加% Provided到 Spark 依赖项即可将它们从 uber-jar 中排除:

libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.0" % Provided
libraryDependencies += "org.apache.spark" %% "spark-sql" % "1.4.0" % Provided

build.sbt.

于 2015-07-17T08:55:35.820 回答