我正在尝试在pyspark shell中设置一些spark参数的配置。
我尝试了以下
spark.conf.set("spark.executor.memory", "16g")
要检查是否已设置执行程序内存,我执行了以下操作
spark.conf.get("spark.executor.memory")
返回了"16g"
。
我尝试使用sc
进行检查
sc._conf.get("spark.executor.memory")
,然后返回"4g"
。
这两个为什么返回不同的值,以及设置这些配置的正确方法是什么?
我还摆弄了一些参数,例如
"spark.executor.instances"
"spark.executor.cores"
"spark.executor.memory"
"spark.executor.memoryOverhead"
"spark.driver.memory"
"spark.driver.cores"
"spark.driver.memoryOverhead"
"spark.memory.offHeap.size"
"spark.memory.fraction"
"spark.task.cpus"
"spark.memory.offHeap.enabled "
"spark.rpc.io.serverThreads"
"spark.shuffle.file.buffer"
有没有一种方法可以设置所有变量的配置。
编辑
我需要以编程方式设置配置。完成spark-submit
或启动pyspark shell后如何更改它?我正在尝试减少我的工作的运行时间,为此我要进行多次迭代,以更改火花配置并记录运行时间。
答案 0 :(得分:1)
您可以通过以下方式设置环境变量:(例如,在spark-env.sh
中,只能是独立的)
SPARK_EXECUTOR_MEMORY=16g
您还可以设置spark-defaults.conf
:
spark.executor.memory=16g
但是这些解决方案是经过硬编码的并且几乎是静态的,并且您想为不同的作业使用不同的参数,但是,您可能需要设置一些默认值。
最好的方法是使用spark-submit
:
spark-submit --executor-memory 16G
以编程方式定义变量的问题是,如果没有优先级规则接管,并且在启动作业后所做的更改将被忽略,则其中一些变量需要在启动时进行定义。
编辑:
创建SparkContext时将查找每个执行程序的内存量。
和
一旦将SparkConf对象传递给Spark,它将被克隆,并且用户无法再对其进行修改。 Spark不支持在运行时修改配置。
您是否尝试过在创建SparkContext
之前更改变量,然后运行迭代,停止SparkContext
并更改变量以再次迭代?
import org.apache.spark.{SparkContext, SparkConf}
val conf = new SparkConf.set("spark.executor.memory", "16g")
val sc = new SparkContext(conf)
...
sc.stop()
val conf2 = new SparkConf().set("spark.executor.memory", "24g")
val sc2 = new SparkContext(conf2)
您可以使用以下命令调试配置:sc.getConf.toDebugString
任何指定为标志或属性文件中的值都将传递到应用程序,并与通过SparkConf指定的值合并。直接在SparkConf上设置的属性具有最高优先级,然后将标志传递到spark-submit或spark-shell,然后是spark-defaults.conf文件中的选项。
您需要确保未以较高的优先级定义变量。
优先顺序:
我希望这会有所帮助。
答案 1 :(得分:1)