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