我尝试使用两种方法来设置spark.dynamicAllocation.minExecutors
,但似乎只有第一种方法有效
spark2 = SparkSession \
.builder \
.appName("test") \
.config("spark.dynamicAllocation.minExecutors", 15) \
.getOrCreate()
vs。
spark2.conf.set("spark.dynamicAllocation.minExecutors", 15)
答案 0 :(得分:1)
方法之间的差异与其说是它们的执行环境不同,不如说是
pyspark.sql.session.SparkSession.Builder
选项。这意味着,如果没有要检索的活动SparkSession
,则仍可以设置某些特定于群集的选项。
如果会话已经初始化,则设置新的配置选项可能不起作用。例如参见Spark 2.0: Redefining SparkSession params through GetOrCreate and NOT seeing changes in WebUI
pyspark.sql.conf.RuntimeConfig
仅可从退出的会话中检索,因此,一旦集群运行,就会调用其set
方法。此时,大多数特定于群集的选项已冻结,无法修改。
通常RuntimeConfig.set
用于修改spark.sql.*
配置参数,通常可以在运行时对其进行更改。
请注意,根据部署模式,某些选项(最著名的是spark.*.extraJavaOptions
)不能使用这些方法中的任何一种来设置,只能通过spark-submit
参数或使用配置文件进行修改。
答案 1 :(得分:1)
我想您想问为什么不能使用spark.dynamicAllocation.minExecutors
和spark2.conf.set
来设置某些配置(例如SparkSession.config
)?
spark.dynamicAllocation.minExecutors
用于控制执行Spark作业的方式,最重要的是控制执行者的数量,因此不应在Spark应用程序中进行设置。听到它完全起作用,我什至感到惊讶。它应该不是真正的恕我直言。
不应在Spark应用程序中设置此配置和某些其他配置的原因是,它们控制底层Spark运行时的执行环境(在Spark SQL的幕后工作),因此应使用{{ 1}}比开发人员本身对应用程序部署人员或管理员的影响更大。是否使用(执行者)动态分配对Spark的业务使用没有影响,并且是在应用程序开发之后做出的决定。
话虽如此,让我直接回答您的问题,在创建spark-submit
实例之前需要设置一些配置,因为它们控制如何实例化此实例。创建实例后,当您调用SparkSession
时,实例已配置完毕,某些配置无法更改。似乎spark2.conf
是创建spark.dynamicAllocation.minExecutors
实例后无法更改的配置之一。鉴于我之前说的话,我很高兴听到这种情况(但不幸的是,并非在所有情况下)。
答案 2 :(得分:0)
在启动SparkSession之前,需要设置一些配置属性才能使它们工作。 Sparksession在初始化时使用它们。如果您在创建sparksession之后设置了spark.dynamicAllocation.minExecutors,则sparConf对象中该属性的值仍然会发生变化,并且您可以通过打印该属性来验证这一点,但由于它采用了该值,因此不会影响sparksession会话在初始化时出现。