Spark 2.0: переопределение параметров SparkSession через GetOrCreate и отсутствие изменений в WebUI

Я использую Spark 2.0 с pySpark.

Я переиначивая SparkSession параметры через GetOrCreate метод, который был введен в версии 2.0:

этот метод сначала проверяет, существует ли допустимый глобальный сеанс 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-shellnspark.master=local[2]nspark.submit.deployMode=client'

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

тогда я переопределить SparkSession config с обещанием увидеть изменения в WebUI

appName (имя)
Задает имя приложения, которое будет отображаться в веб-интерфейсе Spark.

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

где я ошибаюсь?

спасибо заранее!

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, но вы можете проверить, что он действительно остановлен.