【问题标题】:Spark 2.0: Redefining SparkSession params through GetOrCreate and NOT seeing changes in WebUISpark 2.0:通过 GetOrCreate 重新定义 SparkSession 参数,但在 WebUI 中看不到变化
【发布时间】:2016-11-20 07:00:55
【问题描述】:

我正在使用带有 PySpark 的 Spark 2.0。

我正在通过 2.0 中引入的 GetOrCreate 方法重新定义 SparkSession 参数:

此方法首先检查是否存在有效的全局默认 SparkSession,如果有,则返回那个。如果不存在有效的全局默认 SparkSession,则该方法创建一个新的 SparkSession 并将新创建的 SparkSession 分配为全局默认值。

如果返回现有的 SparkSession,此构建器中指定的配置选项将应用于现有的 SparkSession。

https://spark.apache.org/docs/2.0.1/api/python/pyspark.sql.html#pyspark.sql.SparkSession.Builder.getOrCreate

到目前为止一切顺利:

from pyspark import SparkConf

SparkConf().toDebugString()
'spark.app.name=pyspark-shell\nspark.master=local[2]\nspark.submit.deployMode=client'

spark.conf.get("spark.app.name")
'pyspark-shell'

然后我重新定义 SparkSession 配置,承诺查看 WebUI 的变化

应用程序名称(名称)
设置应用程序的名称,该名称将显示在 Spark Web UI 中。

https://spark.apache.org/docs/2.0.1/api/python/pyspark.sql.html#pyspark.sql.SparkSession.Builder.appName

c = SparkConf()
(c
 .setAppName("MyApp")
 .setMaster("local")
 .set("spark.driver.memory","1g")
 )

from pyspark.sql import SparkSession
(SparkSession
.builder
.enableHiveSupport() # metastore, serdes, Hive udf
.config(conf=c)
.getOrCreate())

spark.conf.get("spark.app.name")
'MyApp'

现在,当我转到 localhost:4040 时,我希望看到 MyApp 作为应用名称。

不过,我还是看到了pyspark-shell application UI

我哪里错了?

提前致谢!

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql pyspark-sql


    【解决方案1】:

    我认为这里的文档有点误导,当您使用 Scala 时,您实际上会看到如下警告:

    ... WARN SparkSession$Builder: Use an existing SparkSession, some configuration may not take effect.
    

    在 Spark 2.0 之前更加明显,上下文之间有明确的分离:

    • SparkContext 配置不能在运行时修改。您必须先停止现有上下文。
    • SQLContext 配置可以在运行时修改。

    spark.app.name 与许多其他选项一样,绑定到SparkContext,并且在不停止上下文的情况下无法修改。

    重用现有的SparkContext / SparkSession

    import org.apache.spark.SparkConf
    import org.apache.spark.sql.SparkSession
    
    spark.conf.get("spark.sql.shuffle.partitions")
    
    String = 200
    
    val conf = new SparkConf()
      .setAppName("foo")
      .set("spark.sql.shuffle.partitions", "2001")
    
    val spark = SparkSession.builder.config(conf).getOrCreate()
    
    ... WARN SparkSession$Builder: Use an existing SparkSession ...
    spark: org.apache.spark.sql.SparkSession =  ...
    
    spark.conf.get("spark.sql.shuffle.partitions")
    
    String = 2001
    

    spark.app.name 配置更新时:

    spark.conf.get("spark.app.name")
    
    String = foo
    

    不影响SparkContext:

    spark.sparkContext.appName
    
    String = Spark shell
    

    停止现有的SparkContext / SparkSession

    现在让我们停止会话并重复该过程:

    spark.stop
    val spark = SparkSession.builder.config(conf).getOrCreate()
    
    ...  WARN SparkContext: Use an existing SparkContext ...
    spark: org.apache.spark.sql.SparkSession = ...
    
    spark.sparkContext.appName
    
    String = foo
    

    有趣的是,当我们停止会话时,我们仍然会收到有关使用现有 SparkContext 的警告,但您可以检查它实际上已停止。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,纠结了很久,然后找到一个简单的解决方案:

      spark.stop()

      然后再次构建新的 sparksession

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-04
        • 2017-02-08
        • 1970-01-01
        • 1970-01-01
        • 2017-12-08
        • 2017-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多