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

How to submit multiple Spark applications in parallel without spawning separate JVMs?

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

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

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

1 JVM => 1 app => 1 session => 1 context => 1 RAM/executors/cores config

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

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

用例

您已经开始了很长的 运行ning 工作,比如说需要 4-5 个小时才能完成。该作业在配置 spark.executor.memory=28GBspark.executor.cores=2 的会话中 运行。现在您希望根据用户需求启动 5-10 秒的作业,而无需等待 4-5 小时。这个微小的工作需要 1GB 的内存。 你会怎么做? 代表 long-运行ning-job-session 提交 tinny job?比它将声称 28GB ((

我发现了什么

  1. Spark 允许您仅在会话级别配置 CPU 和执行程序的数量。 Spark scheduling pool 只允许您滑动和切分核心数量,而不是 RAM 或执行器,对吗?
  2. Spark Job Server. But they does't support Spark newer than 2.0, not an option for me. But they actually solve the problem for versions older than 2.0. In Spark JobServer features他们说Separate JVM per SparkContext for isolation (EXPERIMENTAL),也就是说spawn new JVM per context
  3. Mesos fine-grained mode is deprecated
  4. This hack,但在生产中使用风险太大
  5. 隐藏 Apache Spark REST API 用于作业提交,阅读 this and this. There is definitely way to specify executor memory and cores there, but still what is the behavior on submitting two jobs with different configs? As I understand this is Java REST client for it
  6. Livy。不熟悉,但看起来他们有 Java API 只能用于批量提交,这对我来说不是一个选项。

tl;dr 我会说 不可能

一个 Spark 应用程序至少是一个 JVM,并且它在 spark-submit 指定单个 JVM(或一堆充当执行程序的 JVM)的要求时。

但是,如果您想在不启动单独的 JVM 的情况下拥有不同的 JVM 配置,那似乎是不可能的(即使在 Spark 之外,但假设 JVM 正在使用中)。

有了用例,现在就清楚多了。有两种可能的解决方案:

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

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