Spark 2.0:通过GetOrCreate重新定义SparkSession参数,而不是在WebUI中看到更改

时间:2016-11-20 07:00:55

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

我在PySpark上使用Spark 2.0。

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

  

此方法首先检查是否存在有效的全局默认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中查看更改

  

APPNAME(名称)
  设置应用程序的名称,该名称将显示在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

我哪里错了?

提前致谢!

2 个答案:

答案 0 :(得分:9)

我认为文档在这里有点误导,当你使用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的警告,但您可以检查它是否已停止。

答案 1 :(得分:0)

我遇到了同样的问题,并苦苦挣扎了很长时间,然后找到了一个简单的解决方案:

spark.stop()

然后再次建立新的Sparksession