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

时间:2017-03-09 14:54:56

标签: java apache-spark configuration architecture distributed-computing

问题解释

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

问题是you can't create two sessions from single 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),并在它们之间分配资源。此外,这为所有人带来了额外的复杂性:部署,支持等。
  5. 工作类型示例

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

1 个答案:

答案 0 :(得分:1)

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

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