Spark 独立模式多个 shell 会话(应用程序)

Posted

技术标签:

【中文标题】Spark 独立模式多个 shell 会话(应用程序)【英文标题】:Spark Standalone Mode multiple shell sessions (applications) 【发布时间】:2014-06-23 18:57:04 【问题描述】:

在具有多个工作节点的 Spark 1.0.0 独立模式下,我正在尝试从两台不同的计算机(相同的 Linux 用户)运行 Spark shell。

在文档中,它说“默认情况下,提交到独立模式集群的应用程序将按照 FIFO(先进先出)顺序运行,并且每个应用程序都将尝试使用所有可用节点。”

每个工作人员的核心数设置为 4,其中 8 个可用(通过 SPARK_JAVA_OPTS="-Dspark.cores.max=4")。内存也是有限的,因此两者都应该有足够的可用空间。

但是,在查看 Spark Master WebUI 时,稍后启动的 shell 应用程序将始终保持状态“WAITING”,直到第一个退出。分配给它的核数为0,每个节点的内存10G(与已经运行的相同)

有没有办法让两个 shell 同时运行而不使用 Mesos?

【问题讨论】:

很遗憾没有。我真的不需要它,只是会很舒服。如果您不需要充分利用您的集群而只是进行测试,您可以复制 Spark 文件夹并更改设置中的端口以运行两次。 【参考方案1】:

在 shell 开始处理 spark 独立集群之前,必须有足够的内核和内存。您必须从每个 spark shell 中指定所需的内核数,否则它将全部使用。如果您指定 5 个核心,执行程序内存 = 10G(您为执行程序分配的内存量),并且第二个 spark shell 以 2 个核心和 10G 内存运行,第二个仍然不会启动,因为第一个shell 正在使用这两个执行程序,并且正在使用两者上的所有内存。如果为每个 spark shell 指定 5G 的 executor 内存,那么它们可以并发运行。

本质上,您希望在一个独立集群上运行多个作业——不幸的是,它实际上并不是为了很好地处理这种情况而设计的。如果你想这样做,你应该使用 mesos 或 yarn。

【讨论】:

【参考方案2】:

对此的一种解决方法是使用total-executor-cores 限制每个火花外壳的内核数。例如,要将其限制为 16 个核心,请像这样启动它:

bin/spark-shell --total-executor-cores 16 --master spark://$MASTER:7077

在这种情况下,每个 shell 将仅使用 16 个内核,因此您可以在 32 个内核集群上运行两个 shell。然后它们可以同时运行,但每个内核使用的内核数量永远不会超过 16 个:(

我知道,这个解决方案远非理想。您依赖用户来限制自己,关闭他们的 shell,当用户不运行代码时,资源就会被浪费。我创建了a request to fix this on JIRA,你可以投票给它。

【讨论】:

【参考方案3】:

当你的 shell 死掉时,应用程序结束。因此,您不能在两台笔记本电脑上同时运行两个spark-shells。你可以做的是启动一个spark-shell,启动另一个,当第一个死掉时再启动第二个。

spark-shell 不同,spark-submit 会在计算结束后终止。因此,您可以spark-submit 一个应用程序,启动一个spark-shell,并在应用程序完成时让shell 接管。

或者您可以通过两个spark-submit 启动顺序运行两个应用程序(一个接一个)。

【讨论】:

以上是关于Spark 独立模式多个 shell 会话(应用程序)的主要内容,如果未能解决你的问题,请参考以下文章

Spark各运行模式详解

OpenHarmony音频焦点模式开发

Spark中文手册10:spark部署:提交应用程序及独立部署模式

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

spark.driver.extraClassPath 多个罐子

spark考试