Spark:从具有不同内存/核心配置的单个JVM作业同时启动

问题解释

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

问题是您无法从单个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之外运行所有快速搜索任务。 但这是一团糟,因为你需要与Spark并行保留另一个解决方案(如Hazelcast),并在它们之间分配资源。 此外,这为所有人带来了额外的复杂性:部署,支持等。

工作类型示例

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

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

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

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

对于你的情况只是单独使用,不可能有一些前提解决方案,但我没有面对