如何更改Spark设置以允许spark.dynamicAllocation.enabled?

7
我在pyspark中运行python脚本时遇到了以下错误: NameError: name 'spark' is not defined
我查找了一下,发现原因是还不允许使用spark.dynamicAllocation.enabled。
根据Spark的文档(https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-dynamic-allocation.html#spark_dynamicAllocation_enabled),spark.dynamicAllocation.enabled(默认值为false)控制是否启用动态分配。假设spark.executor.instances未设置或为0(默认值)。
由于默认设置为false,因此需要更改Spark设置以启用spark.dynamicAllocation.enabled。
我使用brew安装了Spark,并且没有更改其配置/设置。
如何更改设置并启用spark.dynamicAllocation.enabled?
非常感谢。

以上链接不是 Spark 官方文档,而是 Jack 所著的《精通 Apache Spark》一书,他也是 Stack Overflow 的用户。请相应地更改它 :) - Ram Ghadiyaram
5个回答

8

问题:如何更改设置并启用spark.dynamicAllocation.enabled参数?

有三种方法可以实现这个目标。
1)修改下面提到的参数在spark-defaults.conf
2)从spark-submit中使用 --conf 发送以下参数
3)以编程方式指定动态分配的配置,如下所示。

其中编程方式可以按照以下方式进行:
您可以按照以下方式以编程方式进行设置。

val conf = new SparkConf()
      .setMaster("ClusterManager")
      .setAppName("test-executor-allocation-manager")
      .set("spark.dynamicAllocation.enabled", "true")
      .set("spark.dynamicAllocation.minExecutors", 1)
      .set("spark.dynamicAllocation.maxExecutors", 2)
      .set("spark.shuffle.service.enabled", "true") // for stand alone

非常感谢!我应该将您提供的脚本包含在我编写的pyspark中吗?还是这是我应该修改的配置.sh文件的一部分? - mflowww
你必须将此内容包含在你的Python程序文件中,另外上面是Scala语法。 - Ram Ghadiyaram
非常感谢。我正在编写Python脚本以发送到pyspark。让我尝试修改您在此处建议的内容,看看是否有效。 - mflowww

3

您可以在几个地方进行设置。如果您想要按作业启用它,请在每个应用程序中设置以下内容:

conf.set("spark.dynamicAllocation.enabled","true")

如果您想为所有作业设置它,请导航到spark.conf文件。在Hortonworks发行版中,它应该是:
/usr/hdp/current/spark-client/conf/

将设置添加到您的spark-defaults.conf中,就可以开始使用了。

1
非常感谢!我想按作业启用它。conf.set("spark.dynamicAllocation.enabled","true") 这是一个命令行吗?我应该在终端中输入哪个目录?非常感谢! - mflowww
如果您正在使用spark-shell从命令行运行,请使用以下命令启动shell:spark-shell --conf spark.dynamicAllocation.enabled=true无论您在哪个目录中,当您在com中启动shell时,都不会有影响。如果您正在编写应用程序,请在使用conf.set()创建spark配置后将其设置在应用程序内部。 - Joe Widen
非常感谢。我明白了。如果我正在编写一个Python脚本并尝试在命令行中使用spark-submit运行它(而不是在pyspark shell内部),那么我只需在我的Python脚本中包含这行代码,对吗? - mflowww

1
这是一个影响使用其他资源进行安装的Spark安装问题,例如用于在Amazon Web Services上安装的spark-ec2脚本。根据Spark文档,需要设置SPARK_HOME/conf/spark-defaults.conf中的两个值:
spark.shuffle.service.enabled   true
spark.dynamicAllocation.enabled true

请查看:https://spark.apache.org/docs/latest/configuration.html#dynamic-allocation

如果您的安装中在SPARK_HOME/conf中有spark-env.sh脚本,请确保它没有以下行,或者这些行已被注释掉:

export SPARK_WORKER_INSTANCES=1 #or some other integer, or
export SPARK_EXECUTOR_INSTANCES=1 #or some me other integer

0

可以通过类似以下命令在笔记本中设置 pyspark 的配置参数:

spark.conf.set("spark.sql.crossJoin.enabled", "true")

0
除了之前的回答,所有提到的配置可能因为解释器设置而无法工作(如果您使用Zeppelin)。我使用Livy和它的默认设置覆盖了dynamicAllocation参数。

这可以是一条注释,而不是答案。 - dpapadopoulos

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