如何知道PySpark应用程序的部署模式?

8
我正在尝试解决内存耗尽的问题,想知道是否需要更改位于spark主目录下的默认配置文件(spark-defaults.conf)中的这些设置,或者是否可以在代码中设置。
我看到了这个问题:PySpark: java.lang.OutofMemoryError: Java heap space,它说这取决于我是否在 client 模式下运行。我正在一个集群上运行spark,并使用standalone进行监控。
但是,如何确定我是否在client模式下运行spark?

1
默认情况下,Spark 将在“客户端”模式下运行。如果您想更改此设置,可以将变量“--deploy-mode”设置为“集群”。由于默认模式是“客户端”模式,除非您进行了任何更改,否则我认为您将继续以客户端模式运行。 - KartikKannapur
这是关于两种模式之间差异的有用信息,但这并不能帮助我知道Spark是在集群模式还是客户端模式下运行。我正在生产环境中工作,并在IPython笔记本中运行pyspark。我可以通过SSH访问namenode,并且知道spark home的位置,但除此之外,我不知道从哪里获取有关Spark是否在“client”或“cluster”模式下运行的信息。谢谢。 - makansij
3个回答

10

如果你正在运行交互式shell,例如pyspark(CLI或通过IPython笔记本),则默认情况下你正在以客户端模式运行。你可以轻松验证不能在集群模式下运行pyspark或任何其他交互式shell:

$ pyspark --master yarn --deploy-mode cluster
Python 2.7.11 (default, Mar 22 2016, 01:42:54)
[GCC Intel(R) C++ gcc 4.8 mode] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Error: Cluster deploy mode is not applicable to Spark shells.

$ spark-shell --master yarn --deploy-mode cluster
Error: Cluster deploy mode is not applicable to Spark shells.

检查 bin/pyspark 文件的内容也可能是有帮助的 - 这是最后一行(即实际可执行文件):

$ pwd
/home/ctsats/spark-1.6.1-bin-hadoop2.6
$ cat bin/pyspark
[...]
exec "${SPARK_HOME}"/bin/spark-submit pyspark-shell-main --name "PySparkShell" "$@"

即,pyspark实际上是由spark-submit运行的脚本,并且被命名为PySparkShell,您可以在Spark历史服务器UI中找到它; 由于它是这样运行的,因此它将遵循与其spark-submit命令包含的任何参数(或默认值)一起使用的内容。


OP 询问如何知道正在运行的 Spark(应用程序)的部署模式。 - Jacek Laskowski
4
你认为这是你给出反对票的原因吗?最后,我的回答确实回应了问题,即如何“知道”……问题显然与pyspark API有关,而不是Scala——尽管如此,我还是给了你的回答点赞,因为我学到了东西(这是我点赞的主要标准……)。 - desertnaut
感谢@desertnaut。我很感激你的点赞。我的踩是为了标记你的答案有些离题——你并没有真正回答问题(也许我也没有,但留给OP自己思考:)) - Jacek Laskowski
5
感谢回复。不过我认为,“略有偏差”的答案并不应该被给予负评... - desertnaut

9

由于 PySpark 中没有 sc.deployMode,您可以查看 spark.submit.deployMode 配置属性。

>>> sc.getConf().get("spark.submit.deployMode")
'client'

PySpark中不支持此功能

请使用sc.deployMode

scala> sc.deployMode
res0: String = client

scala> sc.version
res1: String = 2.1.0-SNAPSHOT

对我来说,sc.getConf().get("spark.submit.deployMode")有效 - 注意在getConf后面有额外的括号,因为它是一个函数。我使用的是pyspark==3.2.1版本。 - akki
对于 PySpark 用户来说,圆括号是必须的(不像 Scala)。 - Jacek Laskowski

1
截至Spark 2+,以下内容有效。
for item in spark.sparkContext.getConf().getAll():print(item)

(u'spark.submit.deployMode', u'client') # will be one of the items in the list.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接