Apache spark 是否可以在PySpark中获取当前spark上下文设置?

Apache spark 是否可以在PySpark中获取当前spark上下文设置?,apache-spark,config,pyspark,Apache Spark,Config,Pyspark,我正在尝试获取当前sparkcontext的spark.worker.dir路径 如果我显式地将其设置为config参数,我可以从SparkConf中读取它,但是是否仍然可以使用PySpark访问完整的config(包括所有默认值)?不确定是否可以轻松地获得所有默认设置,但特别是对于worker dir,这是非常艰难的: from pyspark import SparkFiles print SparkFiles.getRootDirectory() 是:sc.getConf().getAl

我正在尝试获取当前
sparkcontext
spark.worker.dir
路径


如果我显式地将其设置为
config参数
,我可以从
SparkConf
中读取它,但是是否仍然可以使用
PySpark
访问完整的
config
(包括所有默认值)?

不确定是否可以轻松地获得所有默认设置,但特别是对于worker dir,这是非常艰难的:

from pyspark import SparkFiles
print SparkFiles.getRootDirectory()
是:sc.getConf().getAll()

它使用以下方法:

SparkConf.getAll()
SparkConf.getAll()

SparkContext.sc.getConf()
SparkContext.sc._conf
注意下面的下划线:这使得这很棘手。我必须查看spark源代码才能找到答案;)

但它确实有效:

In [4]: sc.getConf().getAll()
Out[4]:
[(u'spark.master', u'local'),
 (u'spark.rdd.compress', u'True'),
 (u'spark.serializer.objectStreamReset', u'100'),
 (u'spark.app.name', u'PySparkShell')]
您可以使用:

sc.sparkContext.getConf.getAll
例如,我的Spark程序顶部通常有以下内容:

logger.info(sc.sparkContext.getConf.getAll.mkString("\n"))
火花1.6+

sc.getConf.getAll.foreach(println)

仅用于记录类似的java版本:

Tuple2<String, String> sc[] = sparkConf.getAll();
for (int i = 0; i < sc.length; i++) {
    System.out.println(sc[i]);
}
Tuple2 sc[]=sparkConf.getAll();
对于(int i=0;i
Spark 2.1+

spark.sparkContext.getConf().getAll() 

spark.sparkContext.getConf().getAll()
其中
spark
是您的
sparksession
(为您提供一个带有所有配置设置的
dict

要全面了解您的spark环境和配置,我发现以下代码片段非常有用:

SparkContext:

for item in sorted(sc._conf.getAll()): print(item)
Hadoop配置:

hadoopConf = {}
iterator = sc._jsc.hadoopConfiguration().iterator()
while iterator.hasNext():
    prop = iterator.next()
    hadoopConf[prop.getKey()] = prop.getValue()
for item in sorted(hadoopConf.items()): print(item)
环境变量:

import os
for item in sorted(os.environ.items()): print(item)

对于Spark 2+,您也可以在使用scala时使用

spark.conf.getAll; //spark as spark session 

更新Spark 2.3.1中的配置

要更改默认spark配置,可以执行以下步骤:

导入所需的类

from pyspark.conf import SparkConf
from pyspark.sql import SparkSession
spark.sparkContext._conf.getAll()
conf = spark.sparkContext._conf.setAll([('spark.executor.memory', '4g'), ('spark.app.name', 'Spark Updated Conf'), ('spark.executor.cores', '4'), ('spark.cores.max', '4'), ('spark.driver.memory','4g')])
获取默认配置

from pyspark.conf import SparkConf
from pyspark.sql import SparkSession
spark.sparkContext._conf.getAll()
conf = spark.sparkContext._conf.setAll([('spark.executor.memory', '4g'), ('spark.app.name', 'Spark Updated Conf'), ('spark.executor.cores', '4'), ('spark.cores.max', '4'), ('spark.driver.memory','4g')])
更新默认配置

from pyspark.conf import SparkConf
from pyspark.sql import SparkSession
spark.sparkContext._conf.getAll()
conf = spark.sparkContext._conf.setAll([('spark.executor.memory', '4g'), ('spark.app.name', 'Spark Updated Conf'), ('spark.executor.cores', '4'), ('spark.cores.max', '4'), ('spark.driver.memory','4g')])
停止当前Spark会话

spark.sparkContext.stop()
spark = SparkSession.builder.config(conf=conf).getOrCreate()
创建Spark会话

spark.sparkContext.stop()
spark = SparkSession.builder.config(conf=conf).getOrCreate()

不幸的是,没有,从版本2.3.1开始的Spark平台没有提供任何方式在运行时以编程方式访问每个属性的值。它提供了多种方法来访问通过配置文件显式设置的属性值(如
spark defaults.conf
),在创建会话时通过
SparkConf
对象设置,或在提交作业时通过命令行设置,但这些方法都不会显示未显式设置的属性的默认值。为了完整性,最好的选择是:

  • Spark应用程序的web UI通常位于http://:4040,它有一个带有属性值表的“环境”选项卡
  • SparkContext
    在PySpark中保留对其配置的隐藏引用,并且该配置提供了一个
    getAll
    方法:
    spark.SparkContext.\u conf.getAll()
  • Spark SQL提供返回属性值表的函数:
    Spark.SQL(“SET”).toPandas()
    。您还可以使用
    SET-v
    将一列包含在属性描述中
(这三种方法在我的集群上都返回相同的数据。)

只需运行

sc.getConf().getAll()

应该为您提供一个包含所有设置的列表。

假设我想使用Spark会话在运行时增加驱动程序内存:

s2 = SparkSession.builder.config("spark.driver.memory", "29g").getOrCreate()
现在我想查看更新的设置:

s2.conf.get("spark.driver.memory")
要获取所有设置,可以使用
spark.sparkContext.\u conf.getAll()


如果您想查看数据块中的配置,请使用下面的命令,希望这对您有所帮助

spark.sparkContext._conf.getAll()

我建议您尝试以下方法,以获得当前的spark上下文设置

SparkContext.sc.getConf()
SparkContext.sc._conf
获取专门针对Spark 2.1的默认配置+

spark.sparkContext.getConf().getAll() 
停止当前Spark会话

spark.sparkContext.stop()
spark = SparkSession.builder.config(conf=conf).getOrCreate()
创建Spark会话

spark.sparkContext.stop()
spark = SparkSession.builder.config(conf=conf).getOrCreate()

不-您可以获得conf对象,但不能获得您想要的东西。默认值无法通过
SparkConf
(它们在源代码中硬编码)。而且
spark.worker.dir
听起来像是worker守护进程的配置,而不是你的应用程序会看到的。我的回答直接解决了你的问题:请在这里提供反馈,试图找出
spark.default.parallelism
的值。它位于
sc.defaultParallelism
。您可以在PySpark中执行
dir(sc)
,查看
sc
中的可用内容。此外,请注意,下划线表示包开发人员认为访问此数据元素不是一个好主意。请注意,只有通过spark-defaults.conf、SparkConf或命令行明确指定的值才会出现。对于所有其他配置属性,您可以假设使用了默认值。”(请参阅)@asmaier知道如何让这些未显示的属性在python中显示,而不必访问网页?例如,如何获得“spark.default.parallelism”的值“?
错误:在org.apache.spark.SparkContext中无法访问SparkContext类中的变量\u conf
——这就是spark shell在spark 2.4中的答案。该变量自回答后是否变为私有?该回答被编辑为使用
.getConf
而不是
.u conf
,这使得“注意下划线…”部分不再有意义。1.6.3:>>sc.getConf.getAll.foreach(println)AttributeError:'SparkContext'对象没有属性'getConf'@dovka-我使用了@ecesena建议的相同的
sc.getConf.getAll.foreach(println)
,对我来说效果很好(在Scala中)-也许语法不适用于Python?在pyspark 1.6.0中不适用,正如您可以在这里看到的:@hhantyal否。当问这个问题时,没有spark2.1。顶部答案适用于spark的所有版本,尤其是旧版本。对于spark 2.4.0,它返回元组列表,而不是dict@Kevad我们使用的是Spark 2.4,所以请您介绍一下下面的代码
Spark.sparkContext.getConf().getAll()
Spark-SparkSession sparkContext-(正如我们已经介绍的那样