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-shell
s。你可以做的是启动一个spark-shell
,启动另一个,当第一个死掉时再启动第二个。
与spark-shell
不同,spark-submit
会在计算结束后终止。因此,您可以spark-submit
一个应用程序,启动一个spark-shell
,并在应用程序完成时让shell 接管。
或者您可以通过两个spark-submit
启动顺序运行两个应用程序(一个接一个)。
【讨论】:
以上是关于Spark 独立模式多个 shell 会话(应用程序)的主要内容,如果未能解决你的问题,请参考以下文章
Spark中文手册10:spark部署:提交应用程序及独立部署模式
Spark:从具有不同内存/核心配置的单个JVM作业同时启动