我正在将Spark 2.0与PySpark一起使用。
我正在通过2.0中引入的SparkSession方法重新定义GetOrCreate参数:

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配置,并 promise 会看到WebUI中的更改

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我哪里错了?
提前致谢!

最佳答案

我相信这里的文档有点误导,当您使用Scala时,您实际上会看到这样的警告:

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

在Spark 2.0之前,上下文之间的清晰区分更加明显:
  • SparkContext配置无法在运行时修改。您必须先停止现有上下文。
  • SQLContext配置可以在运行时修改。

  • 像许多其他选项一样,spark.app.name绑定(bind)到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

    现在,让我们停止 session 并重复该过程:

    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
    

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

    10-05 23:30