如何在不产生单独的JVM的情况下并行提交多个Spark应用程序?

VB_*_*VB_ 4 java rest apache-spark spring-data-hadoop

问题是您需要启动单独的JVM来创建每个作业具有不同RAM数量的单独会话。

如何在不手动生成单独的JVM的情况下同时提交几个Spark应用程序?

我的应用程序在单个JVM中的单个服务器上运行。对于每个JVM范例,Spark会话似乎存在问题。Spark范式说:

1 JVM => 1 app => 1 session => 1 context => 1 RAM/executors/cores config
Run Code Online (Sandbox Code Playgroud)

我希望每个Spark应用程序具有不同的配置,而无需手动启动额外的JVM。配置:

  1. spark.executor.cores
  2. spark.executor.memory
  3. spark.dynamicAllocation.maxExecutors
  4. spark.default.parallelism

用例

您已经开始长时间运行,大约需要4-5个小时才能完成工作。该作业与CONFIGS会话中运行spark.executor.memory=28GBspark.executor.cores=2。现在,您要根据用户需求启动5-10秒的工作,而无需等待4-5个小时。这个细小的工作需要1GB的RAM。你会怎么做?从长期运行的工作阶段提交微小的工作?比它将要求28GB((

我发现了什么

  1. Spark允许您仅在会话级别上配置CPU和执行程序的数量。Spark调度池仅允许您滑动和切块数量的内核,而不是RAM或执行程序,对吗?
  2. Spark Job服务器。但是他们不支持Spark高于2.0,这不是我的选择。但是,实际上,它们解决了2.0版之前的问题在Spark JobServer功能中,他们说Separate JVM per SparkContext for isolation (EXPERIMENTAL),这意味着spawn new JVM per context
  3. 不赞成使用Mesos细粒度模式
  4. 这种hack,但是在生产中使用它太冒险了。
  5. 隐藏的Apache Spark REST API用于作业提交,请阅读thisthis。绝对有一种方法可以在其中指定执行程序的内存和内核,但是提交具有不同配置的两个作业仍然是什么行为?据我了解,这是Java REST客户端
  6. 利维。不熟悉它,但是看起来他们只有Java API用于批量提交,这对我来说不是一个选择。

Ric*_*itz 5

对于一个用例,这现在要清楚得多。有两种可能的解决方案:

如果您需要这些作业之间的共享数据,请使用FAIR计划程序和(REST-)前端(SparkJobServer,Livy等也是如此)。您也不需要使用SparkJobServer,如果您有固定的作用域,那么它应该相对容易编码。我已经看到项目朝这个方向发展。您所需要的只是一个事件循环和一种将传入查询转换为Spark查询的方法。从某种意义上说,我希望有一个库来覆盖这个用例,因为当您在基于Spark的应用程序/框架上工作时,几乎总是要构建的第一件事。在这种情况下,您可以根据您的硬件调整执行程序的大小,Spark将管理您的作业计划。利用Yarn的动态资源分配,如果您的框架/应用程序处于空闲状态,则Yarn还将释放资源(杀死执行程序)。 有关更多信息,请阅读此处:http : //spark.apache.org/docs/latest/job-scheduling.html

如果不需要共享数据,请使用YARN(或其他资源管理器)以公平的方式将资源分配给两个作业。YARN具有公平的调度模式,您可以为每个应用程序设置资源需求。如果您认为这很适合您,但是需要共享数据,那么您可能需要考虑使用Hive或Alluxio提供数据接口。在这种情况下,您将运行两个spark-submit,并在集群中维护多个驱动程序。围绕“火花提交”构建附加的自动化功能可以帮助您减少烦恼,并使最终用户更加透明。这种方法也是高延迟的,因为资源分配和SparkSession初始化或多或少地占用固定时间。

  • 如何解决“如何在不手动生成单独的JVM的情况下同时提交几个Spark应用程序”的要求?+“我希望每个Spark应用程序具有不同的配置,而无需手动启动额外的JVM。”?我看不到YARN在这里有什么帮助。 (2认同)