当前位置: 首页 > 面试题库 >

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

法和硕
2023-03-14
问题内容

问题说明

假设您具有带有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. 等等

问题答案:

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对象中指定的。

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



 类似资料:
  • 我正在进行一个spark项目,我使用的是一个由3个节点组成的hadoop集群,配置如下: > 8cores和16go Ram(Namenode、Application Master、nodemanager和spark Master和worker)。 4core和8go Ram(datanode,nodemanager和worker) 4cores和4go Ram(datanode、nodemana

  • 我有两个不同的工作(实际上更多,但为了简单起见,假设2)。每个作业可以与另一个作业并行运行,但同一作业的每个实例应该顺序运行(否则实例将共享彼此的资源)。 基本上,我希望这些作业中的每一个都有自己的作业实例队列。我想我可以使用两个不同的线程池作业启动程序(每个都有一个线程),并将一个作业启动程序与每个作业相关联。 在从Spring Batch Admin web UI中启动作业时,是否有一种方法可

  • 问题内容: 我创建了两个列表和,但是每个列表都有不同的创建方法: 但是输出使我感到惊讶: 使用列表推导创建的列表在内存中更大,但是在Python中这两个列表相同。 这是为什么?这是CPython内部的东西,还是其他解释? 问题答案: 在编写时,Python知道它将需要一个正好包含10个对象的列表,因此它会精确地分配该对象。 当您使用列表推导时,Python不知道它需要多少。因此,随着元素的添加,列

  • 参考: Spark独立集群中的工作者、执行者、核心是什么? 火花独立编号执行器/核心控件 如何使用Spark独立集群在辅助节点上管理多个执行器?

  • 在Springboot中有两个不同的@RestController使用不同的MappingJackson2HttpMessageConverter吗?...或者MappingJackson2HttpMessageConverter对于Spring Boot应用程序中的所有@RESTController是通用的吗? 基本上,目标是使用不同的MappingJackson2HttpMessageConv

  • 我正在尝试对消费者群体进行实验 这是我的代码片段 } 当我同时运行两个spark流媒体作业时,它会出错 线程“main”java中出现异常。lang.IllegalStateException:当前没有分配给组织上的分区venkat4-1。阿帕奇。Kafka。客户。消费者内部。订阅状态。组织上的assignedState(SubscriptionState.java:251)。阿帕奇。Kafka。