我正在构建一个码头化的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)