【发布时间】:2025-12-11 22:45:01
【问题描述】:
问题说明
假设您有带独立管理器的 Spark 集群,其中的作业是通过在客户端应用程序中创建的 SparkSession 安排的。客户端应用程序在 JVM 上运行。为了提高性能,您必须使用不同的配置启动每个作业,请参阅下面的作业类型示例。
问题是you can't create two sessions from single JVM。
那么如何同时启动具有不同会话配置的多个 Spark 作业?
我的意思是不同的会话配置:
spark.executor.coresspark.executor.memoryspark.kryoserializer.buffer.maxspark.scheduler.pool- 等
我的想法
解决问题的可能方法:
- 为同一
SparkSession中的每个 Spark 作业设置不同的会话配置。 有可能吗? - 启动另一个 JVM 只是为了启动另一个
SparkSession,我可以称之为 Spark 会话服务。但是您永远不知道将来要同时启动多少具有不同配置的作业。目前 - 我一次只需要 2-3 个不同的配置。这可能足够但不够灵活。 - 为所有类型的作业使用相同的配置进行全局会话。但是从性能的角度来看,这种方法是有底线的。
- 仅将 Spark 用于繁重的工作,并在 Spark 之外运行所有快速搜索任务。但这是一团糟,因为您需要让另一个解决方案(如 Hazelcast)与 Spark 并行,并在它们之间分配资源。此外,这会给所有人带来额外的复杂性:部署、支持等。
工作类型示例
- 转储庞大的数据库任务。它是 CPU 低但 IO 密集型长时间运行的任务。因此,您可能希望在每个执行程序的内存和内核低的情况下启动尽可能多的执行程序。
- 繁重的句柄转储结果任务。它是 CPU 密集型的,因此您将在每台集群机器上启动一个执行器,具有最大的 CPU 和内核。
- 快速检索数据任务,每台机器需要一个执行器和最少的资源。
- 介于 1-2 和 3 之间的东西,一个作业应该占用集群资源的一半。
- 等
【问题讨论】:
-
可以实现但需要相当长的分析时间。
-
@FaigB 我们已经花费了相当多的分析时间,还没有找到可接受的解决方案。您能否至少分享一下您要分析的内容?
-
您可以使用自定义管理器,该管理器将使用所需的 spark 配置创建流程,并将您喜欢的应用类型作为 spark 作业启动
-
@FaigB 请提供更多详细信息。定制经理是什么?您的意思是扩展 Spark 功能吗?还是已经有解决方案?
-
例如,如果您使用 Yarn。借助纱线管理器,您可以轻松管理具有特定资源分配的队列,这将限制作业资源消耗。还限制在同一队列中同时运行。只需要在启动配置中提供将使用哪个队列。
标签: java apache-spark configuration architecture distributed-computing