2016-11-20 24 views
7

Używam Spark 2.0 z pySpark.Spark 2.0: Przedefiniowanie parametrów SparkSession przez GetOrCreate i NIE widząc zmian w WebUI

ja redefinicji SparkSession parametrów poprzez GetOrCreate metody, która została wprowadzona w wersji 2.0:

Ta metoda sprawdza najpierw, czy istnieje ważny globalny domyślny SparkSession, a jeśli tak, powrót tego. Jeśli nie istnieje ważna globalna wartość domyślna SparkSession, metoda tworzy nową SparkSession i przypisuje nowo utworzoną SparkSession jako globalną wartość domyślną.

Jeśli zostanie zwrócona istniejąca sesja SparkSession, opcje konfiguracji określone w tym programie budującym zostaną zastosowane do istniejącej wersji SparkSession.

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

tej pory tak dobrze:

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' 

Potem przedefiniować SparkSession config z obietnicą, aby zobaczyć zmiany w WebUI

appName (nazwa)
Zestawy nazwa aplikacji, która pojawi się w interfejsie internetowym 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' 

Teraz, kiedy idę do localhost:4040, chciałbym się spodziewać MyApp jako nazwa aplikacji.

jednak wciąż widzę pyspark-shell application UI

Jeżeli się mylę?

Z góry dziękuję!

Odpowiedz

6

wierzę, że dokumentacja jest nieco mylące tutaj i podczas pracy z Scala rzeczywiście zobaczyć ostrzeżenie takiego:

było bardziej oczywiste przed Spark 2.0 z jasnego oddzielenia kontekstach

  • SparkContext Konfiguracja nie może być modyfikowana w środowisku wykonawczym. Najpierw musisz zatrzymać istniejący kontekst.
  • SQLContext konfigurację można modyfikować w środowisku wykonawczym.

, podobnie jak wiele innych opcji, jest powiązany z SparkContext i nie może być modyfikowany bez zatrzymywania kontekstu.

Ponowne użycie istniejących 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 

Podczas spark.app.name config jest aktualizowana:

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

nie wpływa SparkContext:

spark.sparkContext.appName 
String = Spark shell 

Zatrzymanie istniejących SparkContext/SparkSession

Teraz przerwać sesję i powtórzyć proces:

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 

Co ciekawe, kiedy przerwać sesję wciąż otrzymuję ostrzeżenie o użyciu istniejącego SparkContext, ale można sprawdzić w rzeczywistości jest zatrzymany.