使用SBT制作Spark Fat Jar的正确方法

时间:2015-05-23 16:02:58

标签: scala jar apache-spark sbt sbt-assembly

我需要一个带有Spark的Fat Jar,因为我正在为Knime创建一个自定义节点。基本上它是在Knime内部执行的自包含jar,我假设Fat Jar是产生本地Spark Job的唯一方法。最终我们将继续向远程集群提交作业,但现在我需要它以这种方式生成。

那就是说,我用这个做了一个胖罐:https://github.com/sbt/sbt-assembly

我创建了一个空的sbt项目,在依赖项中包含了Spark-core并组装了Jar。我将它添加到我的自定义Knime节点的清单中,并尝试生成一个简单的作业(pararellize一个集合,收集并打印它)。它开始但我得到这个错误:

  

未找到键'akka.version'的配置设置

我不知道如何解决它。

编辑:这是我的build.sbt

name := "SparkFatJar"

version := "1.0"

scalaVersion := "2.11.6"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "1.3.0"
)


libraryDependencies +=  "com.typesafe.akka" %% "akka-actor" % "2.3.8"

assemblyJarName in assembly := "SparkFatJar.jar"

assemblyMergeStrategy in assembly := {
  case PathList("META-INF", xs @ _*) => MergeStrategy.discard
  case x => MergeStrategy.first
}

我在互联网上的某个地方找到了Spark的合并策略,但我现在找不到源代码。

1 个答案:

答案 0 :(得分:5)

我认为问题在于你如何设置assemblyMergeStrategy。试试这个:

assemblyMergeStrategy in assembly := {
  case PathList("META-INF", xs @ _*) => MergeStrategy.discard
  case "application.conf"            => MergeStrategy.concat
  case "reference.conf"              => MergeStrategy.concat
  case x =>
    val baseStrategy = (assemblyMergeStrategy in assembly).value
    baseStrategy(x)
}