【问题标题】:Spark: launch from single JVM jobs with different memory/cores configs simultaneouslySpark:同时从具有不同内存/内核配置的单个 JVM 作业启动
【发布时间】:2025-12-11 22:45:01
【问题描述】:

问题说明

假设您有带独立管理器的 Spark 集群,其中的作业是通过在客户端应用程序中创建的 SparkSession 安排的。客户端应用程序在 JVM 上运行。为了提高性能,您必须使用不同的配置启动每个作业,请参阅下面的作业类型示例

问题是you can't create two sessions from single JVM

那么如何同时启动具有不同会话配置的多个 Spark 作业?

我的意思是不同的会话配置:

  • spark.executor.cores
  • spark.executor.memory
  • spark.kryoserializer.buffer.max
  • spark.scheduler.pool

我的想法

解决问题的可能方法:

  1. 为同一 SparkSession 中的每个 Spark 作业设置不同的会话配置。 有可能吗?
  2. 启动另一个 JVM 只是为了启动另一个 SparkSession,我可以称之为 Spark 会话服务。但是您永远不知道将来要同时启动多少具有不同配置的作业。目前 - 我一次只需要 2-3 个不同的配置。这可能足够但不够灵活。
  3. 为所有类型的作业使用相同的配置进行全局会话。但是从性能的角度来看,这种方法是有底线的。
  4. 仅将 Spark 用于繁重的工作,并在 Spark 之外运行所有快速搜索任务。但这是一团糟,因为您需要让另一个解决方案(如 Hazelcast)与 Spark 并行,并在它们之间分配资源。此外,这会给所有人带来额外的复杂性:部署、支持等。

工作类型示例

  1. 转储庞大的数据库任务。它是 CPU 低但 IO 密集型长时间运行的任务。因此,您可能希望在每个执行程序的内存和内核低的情况下启动尽可能多的执行程序。
  2. 繁重的句柄转储结果任务。它是 CPU 密集型的,因此您将在每台集群机器上启动一个执行器,具有最大的 CPU 和内核。
  3. 快速检索数据任务,每台机器需要一个执行器和最少的资源。
  4. 介于 1-2 和 3 之间的东西,一个作业应该占用集群资源的一半。

【问题讨论】:

  • 可以实现但需要相当长的分析时间。
  • @FaigB 我们已经花费了相当多的分析时间,还没有找到可接受的解决方案。您能否至少分享一下您要分析的内容?
  • 您可以使用自定义管理器,该管理器将使用所需的 spark 配置创建流程,并将您喜欢的应用类型作为 spark 作业启动
  • @FaigB 请提供更多详细信息。定制经理是什么?您的意思是扩展 Spark 功能吗?还是已经有解决方案?
  • 例如,如果您使用 Yarn。借助纱线管理器,您可以轻松管理具有特定资源分配的队列,这将限制作业资源消耗。还限制在同一队列中同时运行。只需要在启动配置中提供将使用哪个队列。

标签: java apache-spark configuration architecture distributed-computing


【解决方案1】:

Spark 独立版为应用程序使用简单的 FIFO 调度程序。默认情况下,每个应用程序都使用集群中的所有可用节点。可以限制每个应用程序、每个用户或全局的节点数量。其他资源,例如内存、cpus 等,可以通过应用程序的 SparkConf 对象进行控制。

Apache Mesos 有主从进程。 master 向应用程序(在 Apache Mesos 中称为框架)提供资源,应用程序要么接受要么不接受。因此,声明可用资源和运行作业是由应用程序本身决定的。 Apache Mesos 允许对系统中的资源进行细粒度控制,例如 CPU、内存、磁盘和端口。 Apache Mesos 还提供对资源的粗粒度控制控制,其中 Spark 预先为每个执行程序分配固定数量的 CPU,这些 CPU 在应用程序退出之前不会释放。请注意,在同一个集群中,可以将某些应用程序设置为使用细粒度控制,而将其他应用程序设置为使用粗粒度控制。

Apache Hadoop YARN 有一个 ResourceManager,它由两部分组成,一个 Scheduler 和一个 ApplicationsManager。调度器是一个可插拔的组件。提供了两种实现,一种是CapacityScheduler,在由多个组织共享的集群中很有用,另一种是FairScheduler,它确保所有应用程序平均获得相同数量的资源。两个调度程序都将应用程序分配给一个队列,每个队列都获得在它们之间平等共享的资源。在队列中,资源在应用程序之间共享。 ApplicationsManager 负责接受作业提交并启动特定于应用程序的 ApplicationsMaster。在这种情况下,ApplicationsMaster 是 Spark 应用程序。在 Spark 应用程序中,资源在应用程序的 SparkConf 对象中指定。

对于您的情况,仅使用独立的情况是不可能的,可能会有一些前提解决方案,但我没有遇到过

【讨论】:

  • 你能看看这个问题*.com/questions/42860835/…吗?这是当前版本的延续
  • @FraigB 首先-感谢您的回答!你能解释一下关于YARN的一件事吗?这里的关键点是单个 Spark 会话(单个 JVM)。是否可以在单个 Spark 会话/应用程序中解决 YARN 的问题?你能看看*.com/questions/43940349/…
  • Apache Mesos 也弃用了细粒度模式 spark.apache.org/docs/latest/…。粗粒度模式和动态分配能否解决问题?
  • 这个关于独立的答案似乎有道理,但实际上是不正确的(见我的答案)
最近更新 更多