sparksession.config()和spark.conf.set()

时间:2018-10-09 13:01:44

标签: apache-spark pyspark

我尝试使用两种方法来设置spark.dynamicAllocation.minExecutors,但似乎只有第一种方法有效

spark2 = SparkSession \
  .builder \
  .appName("test") \
  .config("spark.dynamicAllocation.minExecutors", 15) \
  .getOrCreate()

vs。

spark2.conf.set("spark.dynamicAllocation.minExecutors", 15)

3 个答案:

答案 0 :(得分:1)

方法之间的差异与其说是它们的执行环境不同,不如说是

    可以在启动Spark应用程序之前执行
  • 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.minExecutorsspark2.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会话在初始化时出现。