问题解释
假设您有带有独立管理器的 Spark 集群,其中的作业是通过在客户端应用程序中创建的 SparkSession
来安排的。客户端应用程序在 JVM 上运行。为了提高性能,您必须使用不同的配置启动每个作业,请参阅下面的作业类型示例。
问题是you can't create two sessions from single JVM .
那么如何同时启动具有不同 session 配置的多个 Spark 作业?
通过不同的 session 配置,我的意思是:
spark.executor.cores
spark.executor.memory
spark.kryoserializer.buffer.max
spark.scheduler.pool
- 等等
我的想法
解决问题的可能方法:
- 为同一
SparkSession
中的每个 Spark 作业设置不同的 session 配置。 可能吗? - 启动另一个 JVM 只是为了启动另一个
SparkSession
,我可以将其称为 Spark session 服务。但你永远不知道将来会同时启动多少个具有不同配置的作业。目前 - 我一次只需要 2-3 个不同的配置。可能足够了,但不够灵活。 - 使用相同的配置为各种作业创建全局 session 。但从性能的角度来看,这种方法是底部。
- 仅将 Spark 用于繁重的作业,并在 Spark 之外运行所有快速搜索任务。但这是一团糟,因为您需要让另一个解决方案(例如 Hazelcast)与 Spark 并行,并在它们之间分配资源。此外,这给所有人带来了额外的复杂性:部署、支持等。
作业类型示例
- 转储巨大的数据库任务。它的 CPU 低但 IO 密集型长时间运行任务。因此,您可能希望在每个执行器的内存和内核数较低的情况下启动尽可能多的执行器。
- 繁重的处理转储结果任务。它是 CPU 密集型的,因此您将在每个集群计算机上启动一个执行程序,并具有最大的 CPU 和内核数。
- 快速检索数据任务,每台机器需要一个执行器,资源最少。
- 介于 1-2 和 3 之间的值,其中作业应占用一半的集群资源。
- 等等
最佳答案
Spark Standalone 对应用程序使用简单的 FIFO 调度程序。默认情况下,每个应用程序都使用集群中的所有可用节点。每个应用程序、每个用户或全局的节点数量可以受到限制。其他资源,例如内存、CPU 等可以通过应用程序的 SparkConf 对象进行控制。
Apache Mesos 有主进程和从进程。主服务器向应用程序(在 Apache Mesos 中称为框架)提供资源,应用程序要么接受,要么不接受。因此,声明可用资源和运行作业是由应用程序本身决定的。 Apache Mesos 允许对系统中的资源(例如 CPU、内存、磁盘和端口)进行细粒度控制。 Apache Mesos 还提供对资源的粗粒度控制,其中 Spark 提前为每个执行器分配固定数量的 CPU,这些 CPU 直到应用程序退出时才会释放。请注意,在同一集群中,某些应用程序可以设置为使用细粒度控制,而其他应用程序则设置为使用粗粒度控制。
Apache Hadoop YARN 的 ResourceManager 包含两个部分:调度程序和应用程序管理器。调度程序是一个可插入组件。提供了两种实现:CapacityScheduler(在由多个组织共享的集群中非常有用)和 FairScheduler(确保所有应用程序平均获得相同数量的资源)。两个调度程序都将应用程序分配到队列,每个队列获取在它们之间平等共享的资源。在队列中,资源在应用程序之间共享。 ApplicationsManager 负责接受作业提交并启动应用程序特定的ApplicationsMaster。在本例中,ApplicationsMaster 是 Spark 应用程序。在 Spark 应用程序中,资源在应用程序的 SparkConf 对象中指定。
对于您的独立案例,这是不可能的,可能有一些前提解决方案,但我还没有遇到
关于java - Spark : launch from single JVM jobs with different memory/cores configs simultaneously,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42698500/