【发布时间】:2016-07-26 01:40:59
【问题描述】:
我正在使用 Scala 构建一个 Apache Spark 应用程序,并且我正在使用 SBT 来构建它。事情是这样的:
- 当我在 IntelliJ IDEA 下开发时,我希望将 Spark 依赖项包含在类路径中(我正在启动一个带有主类的常规应用程序)
- 当我打包应用程序(感谢 sbt-assembly)插件时,我确实不希望 Spark 依赖项包含在我的胖 JAR 中
- 当我通过
sbt test运行单元测试时,我希望将 Spark 依赖项包含在类路径中(与 #1 相同,但来自 SBT)
为了匹配约束 #2,我将 Spark 依赖项声明为 provided:
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-streaming" % sparkVersion % "provided",
...
)
然后,sbt-assembly's documentation 建议添加以下行以包含单元测试的依赖项(约束 #3):
run in Compile <<= Defaults.runTask(fullClasspath in Compile, mainClass in (Compile, run), runner in (Compile, run))
这让我的约束 #1 没有被完全填充,即我无法在 IntelliJ IDEA 中运行应用程序,因为 Spark 依赖项没有被拾取。
使用 Maven,我使用特定的配置文件来构建 uber JAR。这样,我将 Spark 依赖项声明为主要配置文件(IDE 和单元测试)的常规依赖项,同时将它们声明为 provided 用于胖 JAR 打包。见https://github.com/aseigneurin/kafka-sandbox/blob/master/pom.xml
使用 SBT 实现这一目标的最佳方法是什么?
【问题讨论】:
-
只是提醒一下,当使用
spark-submit时,spark 将使用 spark 安装路径中的库,而不是您打包到程序集 jar 中的库。除非你特别告诉它。配置名为 ``` sbt 和 Maven 都有汇编插件。创建程序集 jar 时,将 Spark 和 Hadoop 列为提供的依赖项;这些不需要捆绑,因为它们是由集群管理器在运行时提供的。一旦你有一个组装好的 jar,你可以在传递你的 jar 时调用 bin/spark-submit 脚本,如下所示。```
标签: intellij-idea apache-spark sbt sbt-assembly