问题解释
假设您有带有独立管理器的 Spark 集群,其中作业通过SparkSession
在客户端应用程序中创建。客户端应用程序在 JVM 上运行。为了提高性能,您必须使用不同的配置启动每个作业,请参阅职位类型示例 below.
问题是您无法从单个 JVM 创建两个会话 https://stackoverflow.com/questions/40153728/multiple-sparksessions-in-single-jvm.
那么如何同时启动具有不同会话配置的多个 Spark 作业呢?
通过不同的会话配置我的意思是:
spark.executor.cores
spark.executor.memory
spark.kryoserializer.buffer.max
spark.scheduler.pool
- etc
我的想法
解决问题的可能方法:
- 为同一个 Spark 作业中的每个 Spark 作业设置不同的会话配置
SparkSession
. 是否可以?
- 启动另一个 JVM 只是为了启动另一个
SparkSession
,我可以称之为 Spark 会话服务。但你永远不知道将来会同时启动多少个具有不同配置的作业。目前 - 我一次只需要 2-3 个不同的配置。可能足够了,但不够灵活。
- 使用相同的配置为各种作业创建全局会话。但这种做法从性能角度来看是底部。
- 仅将 Spark 用于繁重的作业,并在 Spark 之外运行所有快速搜索任务。但这是一团糟,因为您需要让另一个解决方案(例如 Hazelcast)与 Spark 并行,并在它们之间分配资源。此外,这给所有人带来了额外的复杂性:部署、支持等。
职位类型示例
- 转储巨大的数据库任务。它的 CPU 低但 IO 密集型长时间运行任务。因此,您可能希望在每个执行器的内存和核心数较低的情况下启动尽可能多的执行器。
- 繁重的处理转储结果任务。它是 CPU 密集型的,因此您将在每台集群机器上启动一个执行程序,并具有最大的 CPU 和内核数。
- 快速检索数据任务,每台机器需要一个执行器和最少的资源。
- 介于 1-2 和 3 之间的值,其中作业应占用一半的集群资源。
- etc.
Spark 独立版为应用程序使用简单的 FIFO 调度程序。默认情况下,每个应用程序都使用集群中的所有可用节点。每个应用程序、每个用户或全局的节点数量可以受到限制。其他资源,例如内存、CPU 等可以通过应用程序的 SparkConf 对象进行控制。
Apache Mesos 有主进程和从属进程。主服务器向应用程序(在 Apache Mesos 中称为框架)提供资源,应用程序要么接受,要么不接受。因此,声明可用资源和运行作业是由应用程序本身决定的。 Apache Mesos 允许对系统中的资源(例如 CPU、内存、磁盘和端口)进行细粒度控制。 Apache Mesos 还提供对资源的粗粒度控制,其中 Spark 提前为每个执行器分配固定数量的 CPU,这些 CPU 直到应用程序退出时才会释放。请注意,在同一集群中,某些应用程序可以设置为使用细粒度控制,而其他应用程序则设置为使用粗粒度控制。
Apache Hadoop YARN 的 ResourceManager 包含两个部分:调度程序和应用程序管理器。调度程序是一个可插入组件。提供了两种实现:CapacityScheduler(在多个组织共享的集群中非常有用)和 FairScheduler(确保所有应用程序平均获得相同数量的资源)。两个调度程序都将应用程序分配到队列,每个队列获取在它们之间平等共享的资源。在队列中,资源在应用程序之间共享。 ApplicationsManager 负责接受作业提交并启动应用程序特定的ApplicationsMaster。在本例中,ApplicationsMaster 是 Spark 应用程序。在 Spark 应用程序中,资源在应用程序的 SparkConf 对象中指定。
对于您的独立情况,这是不可能的,可能有一些前提解决方案,但我还没有遇到过
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)