【问题标题】:How to know deploy mode of PySpark application?如何知道 PySpark 应用程序的部署模式?
【发布时间】:2016-11-17 23:05:50
【问题描述】:

我正在尝试解决内存不足的问题,我想知道是否需要在 spark 主文件夹的默认配置文件 (spark-defaults.conf) 中更改这些设置。或者,如果我可以在代码中设置它们。

我看到了这个问题PySpark: java.lang.OutofMemoryError: Java heap space,它说这取决于我是否在client 模式下运行。我正在集群上运行 spark 并使用独立的方式对其进行监控。

但是,我如何确定我是否在 client 模式下运行 spark?

【问题讨论】:

  • 默认情况下,spark 将以client 模式运行。如果要更改此设置,可以将变量 --deploy-mode 设置为 cluster。由于默认为client 模式,除非您进行任何更改,否则我想您将在客户端模式下运行。
  • 这是关于两种模式之间差异的有用信息,但这并不能帮助我了解 spark 是在集群模式还是客户端模式下运行。我在生产环境中工作,我在 IPython 笔记本中运行 pyspark。我可以通过 ssh 访问名称节点,并且我知道 spark home 在哪里,但除此之外,我不知道从哪里获取有关 spark 是在 client 还是 cluster 模式下运行的信息。谢谢。

标签: apache-spark cluster-computing pyspark


【解决方案1】:

如果您正在运行交互式 shell,例如pyspark(CLI 或通过 IPython 笔记本),默认情况下您在 client 模式下运行。您可以轻松验证您不能cluster 模式下运行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 History Server UI 中找到它;并且因为它是这样运行的,所以它使用 spark-submit 命令中包含的任何参数(或默认值)。

【讨论】:

  • OP 询问如何知道 running spark(应用程序)的部署模式。
  • 你认为这个理由不赞成?最后,我的回答确实解决了这个问题,即如何知道 ...问题也很明显是关于 pyspark API,而不是 Scala - 不过,我赞成你的回答,因为我学到了一些东西(并且这是我支持的主要标准...)。
  • 谢谢@desertnaut。我很感激赞成。我的反对意见是把你的答案标记为有点离谱——你并没有真正回答这个问题(我可能也没有回答,但给 OP 留下了一份家庭作业:))
  • 感谢您的回复。我会争辩说,“有点离谱”的答案不值得被否决……
【解决方案2】:

由于 sc.deployMode 在 PySpark 中不可用,您可以查看 spark.submit.deployMode

scala> sc.getConf.get("spark.submit.deployMode")
res0: String = client

这在 PySpark 中不可用

使用sc.deployMode

scala> sc.deployMode
res0: String = client

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

【讨论】:

    【解决方案3】:

    从 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 2022-07-19
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      相关资源
      最近更新 更多