使用 SBT 制作 Spark Fat Jar 的正确方法
Proper way to make a Spark Fat Jar using SBT
我需要一个带有 Spark 的 Fat Jar,因为我正在为 Knime 创建一个自定义节点。基本上它是一个在 Knime 内部执行的独立 jar,我认为 Fat Jar 是产生本地 Spark 作业的唯一方法。最终我们将继续向远程集群提交作业,但现在我需要它以这种方式生成。
就是说,我用这个做了一个 Fat Jar:https://github.com/sbt/sbt-assembly
我创建了一个空的 sbt 项目,将 Spark-core 包含在依赖项中并组装了 Jar。我将它添加到我的自定义 Knime 节点的清单中,并尝试生成一个简单的作业(并行化一个集合,收集它并打印它)。它开始了,但我得到这个错误:
No configuration setting found for key '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 的合并策略,但我现在找不到来源。
我认为问题在于您的设置方式 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)
}
我需要一个带有 Spark 的 Fat Jar,因为我正在为 Knime 创建一个自定义节点。基本上它是一个在 Knime 内部执行的独立 jar,我认为 Fat Jar 是产生本地 Spark 作业的唯一方法。最终我们将继续向远程集群提交作业,但现在我需要它以这种方式生成。
就是说,我用这个做了一个 Fat Jar:https://github.com/sbt/sbt-assembly
我创建了一个空的 sbt 项目,将 Spark-core 包含在依赖项中并组装了 Jar。我将它添加到我的自定义 Knime 节点的清单中,并尝试生成一个简单的作业(并行化一个集合,收集它并打印它)。它开始了,但我得到这个错误:
No configuration setting found for key '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 的合并策略,但我现在找不到来源。
我认为问题在于您的设置方式 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)
}