小编典典

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

java

问题说明

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

问题是您不能从单个JVM创建两个会话

那么,您如何同时使用不同的会话配置启动多个Spark作业?

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

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

我的想法

解决问题的可能方法:

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

作业类型示例

  1. 转储巨大的数据库任务。这是CPU不足但IO密集且长时间运行的任务。因此,您可能希望以尽可能低的内存和每个执行器内核启动尽可能多的执行器。
  2. 繁重的处理转储结果任务。它占用大量CPU,因此您将在每台群集计算机上启动一个执行程序,并使用最大的CPU和内核。
  3. 快速检索数据任务,每台计算机需要一个执行程序,并且资源最少。
  4. 介于1-2和3之间的中间位置,在此位置作业应占用一半的群集资源。
  5. 等等

阅读 215

收藏
2020-11-30

共1个答案

小编典典

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

Apache Mesos具有主进程和从属进程。主服务器向应用程序提供资源(在Apache
Mesos中称为框架),该资源可以接受也可以不接受。因此,要求可用资源和正在运行的作业由应用程序本身确定。Apache
Mesos允许对系统中的资源(例如cpus,内存,磁盘和端口)进行细粒度的控制。Apache
Mesos还提供了资源的过程控制控制,Spark会为每个执行器预先分配固定数量的CPU,直到应用程序退出时才释放这些CPU。请注意,在同一群集中,可以将某些应用程序设置为使用细粒度控制,而将其他应用程序设置为使用过程细粒度控制。

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

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

2020-11-30