设置spark上下文配置优先级spark-submit



我正在构建一个码头化的spark应用程序,该应用程序将通过一个entrypoint.sh文件运行,而该文件又运行spark-submit:

#!/bin/bash
export SPARK_DIST_CLASSPATH=$(hadoop classpath):$HADOOP_HOME/share/hadoop/*
export _JAVA_OPTIONS="-Xms2g -Xmx8g -XX:MaxPermSize=8g"
spark-submit 
--master local 
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:///job/log4j.properties" 
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:///job/log4j.properties"
--files "/job/log4j.properties" 
main.py --train_path $1 --test_path $2

正如您所看到的,我正在通过spark-submit--conf选项设置部分配置。

如果在spark-submit语句中,我设置了一个配置参数,该参数也将通过:在main.py中设置

SparkConf().set(option, value)

set的优先级高于spark-submit,因此无论以何种方式设置配置,只有使用SparkConf().set设置的配置才会占上风(参见其他问题(。

我一直在努力实现的是能够控制火花配置优先考虑spark-submit中设置的内容。似乎有参数SparkConf.setIfMissing,但我不确定我是否正确使用了它。

我尝试的是安装一个SparkConf()对象,并使用前面提到的方法将配置设置为:SparkConf().setIfMissing(option, value)。但它不起作用。它覆盖spark-submit中设置的任何内容。我的猜测是,在上下文未初始化之前,您无法检索通过spark-submit设置的内容。

所以我不确定如何在这种情况下使用SparkConf.setIfMissing,如果这是它的目的的话?否则,是否有其他方法来实现这种行为?如果有任何帮助,我将不胜感激。

我设法解决了这个问题。停止SparkContext并通过spark-submit检索所有参数集,然后创建一个新的上下文。步骤如下:

  • 初始化SparkContext
  • 通过sc.getConf()检索所有先前设置的配置,并使用sc.stop()停止先前的上下文
  • 使用SparkConf().setIfMissing()设置所有剩余配置,并使用新配置SparkContext(conf=conf)创建新上下文

最后一步允许通过spark-submit对配置集进行优先级排序。这样,只有以前未设置的参数才能通过此方法进行设置。在代码中,这将是:

config = my_config_dict
sc = SparkContext()
sc.stop()
conf = sc.getConf()
for option in my_config_dict.keys():
conf.setIfMissing(option, my_config_dict[option])
sc = SparkContext(conf=conf)

最新更新