如何构建真正本地的 Apache Spark "fat" jar。 JRE内存问题?

How to build a truly local Apache Spark "fat" jar. JRE memory issues?

长话短说: 我有一个使用 Spark 数据帧和机器学习的应用程序,以及用于前端的 ScalaFX。 我想创建一个巨大的 'fat' jar,以便它 运行 可以在任何带有 JVM 的机器上使用。

我熟悉 assembly sbt 插件,研究了几个小时组装 jar 的方法。下面是我的 build.sbt:

lazy val root = (project in file(".")).
  settings(
  scalaVersion := "2.11.8",
  mainClass in assembly := Some("me.projects.MyProject.Main"),
  assemblyJarName in assembly := "MyProject_2.0.jar",
  test in assembly := {}
  )

libraryDependencies += "org.apache.spark" %% "spark-core" % "2.0.0" withSources() withJavadoc()
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.0.0" withSources() withJavadoc()
libraryDependencies += "org.apache.spark" %% "spark-mllib" % "2.0.2" withSources() withJavadoc()
libraryDependencies += "joda-time" % "joda-time" % "2.9.4" withJavadoc()
libraryDependencies += "org.scalactic" %% "scalactic" % "3.0.1" % "provided"
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.1" % "test"
libraryDependencies += "org.scalafx" %% "scalafx" % "8.0.92-R10" withSources() withJavadoc()
libraryDependencies += "net.liftweb" %% "lift-json" % "2.6+" withSources() withJavadoc()

EclipseKeys.withSource := true
EclipseKeys.withJavadoc := true

// META-INF discarding
assemblyMergeStrategy in assembly := {
  case PathList("org","aopalliance", xs @ _*) => MergeStrategy.last
  case PathList("javax", "inject", xs @ _*) => MergeStrategy.last
  case PathList("javax", "servlet", xs @ _*) => MergeStrategy.last
  case PathList("javax", "activation", xs @ _*) => MergeStrategy.last
  case PathList("org", "apache", xs @ _*) => MergeStrategy.last
  case PathList("com", "google", xs @ _*) => MergeStrategy.last
  case PathList("com", "esotericsoftware", xs @ _*) => MergeStrategy.last
  case PathList("com", "codahale", xs @ _*) => MergeStrategy.last
  case PathList("com", "yammer", xs @ _*) => MergeStrategy.last
  case "about.html" => MergeStrategy.rename
  case "META-INF/ECLIPSEF.RSA" => MergeStrategy.last
  case "META-INF/mailcap" => MergeStrategy.last
  case "META-INF/mimetypes.default" => MergeStrategy.last
  case "plugin.properties" => MergeStrategy.last
  case "log4j.properties" => MergeStrategy.last
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}

这 运行 在我的 Linux 机器上很好,它安装并配置了 spark。在我使用 ScalaFX 组装罐子并在 Windows 机器上打开它们之前没有任何问题。但是,这个也使用 Spark 的应用程序提供了以下内容:

ERROR SparkContext: Error initializing SparkContext.
java.lang.IllegalArgumentException: System memory 259522560 must be at least 471859200. Please increase the heap size using the --driver-memory option or spark.driver.memory in Spark configuration.

我尝试过的事情:

应用程序在其他方面工作正常(当 运行 在 Scala IDE 中,当 运行 使用 spark-submit,当在 linux 中打开组装的 jar 时)。

如果可行,请告诉我。这是一个使用 GUI (ScalaFX) 对某些数据 (Spark) 进行 运行 几个机器学习操作的小项目。因此上面的依赖关系。

同样,我不打算设置集群或类似的东西。我想通过 运行 在任何带有 JRE 的计算机上安装 jar 来访问 Spark 功能。 这是一个有待展示的小项目。

在声明 SparkConf 时尝试使用 .set("spark.driver.memory","5g")。当然如果你机器上有5+g以上的内存。

事实证明这是一个相当普遍的 JVM 问题。我不是仅仅添加运行时参数,而是通过向 Windows 系统添加一个新的环境变量来解决这个问题:

姓名:_JAVA_OPTIONS 值:-Xms512M -Xmx1024M