我正在将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
的警告,但是您可以检查它是否实际上已停止。