SparkLauncher和Java -jar fat-jar相比有什么好处?

Tom*_*Tom 5 apache-spark

我知道SparkLauncher用于以编程方式而不是使用spark-submit脚本来启动Spark应用程序,但是何时使用SparkLauncher或有什么好处,我感到有些困惑。

以下代码使用SparkLauncher启动主类为的Spark应用程序"org.apache.spark.launcher.WordCountApp

代码是:

object WordCountSparkLauncher {
  def main(args: Array[String]) {
    val proc = new SparkLauncher()
      .setAppName("WordCountSparkLauncherApp")
      .setMaster("local")
      .setSparkHome("D:/spark-2.2.0-bin-hadoop2.7")
      .setAppResource("file:///d:/spark-2.2.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.2.0.jar")
      .setVerbose(true)
      .setMainClass("org.apache.spark.launcher.WordCountApp")
      .launch()

    new Thread(new IORunnable(proc.getInputStream, "proc-input-stream")).start()

    new Thread(new IORunnable(proc.getErrorStream, "proc-error-input-stream")).start()

    proc.waitFor()

  }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但还有另一种选择:

使用maven shade插件创建一个可运行的胖罐,将所有与spark相关的依赖项打包到一个jar中,这样,我仍然可以使用来运行spark应用程序java -jar thefatjar

SparkLaunchervs胖子罐子有什么好处?

Jac*_*ski 5

SparkLauncher有什么好处,SparkLauncher比可运行的胖罐有什么好处吗?

考虑一下启动Spark应用程序的不同方式以及具有的集成选项。

使用胖子罐,您必须安装Java,启动Spark应用程序需要执行java -jar [your-fat-jar-here]。如果要从Web应用程序启动该应用程序,则很难使其自动化。

随着SparkLauncher你在给定的启动从另一个应用程序时,Spark应用,例如上面的Web应用程序的选项。这很容易。

虽然两者都以某种方式为您提供了集成点,但是SparkLauncher从另一个基于JVM的应用程序中使用它们更简单。您不必还原为使用命令行(具有自己的“漂亮内容”)。

如果要在另一个程序中运行spark应用程序,则只需在Web应用程序中创建SparkContext,spark用作Web中的常规框架。

这将使Web应用程序和Spark应用程序紧密耦合在一起,并在Spark应用程序执行时保持计算资源(如线程)繁忙。HTTP请求是短期的,而Spark作业是长期的。