设置火花上下文配置优先火花提交

Set spark context configuration prioritizing spark-submit

我正在构建一个 dockerized 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  --test_path 

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

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

SparkConf().set(option, value)

set 优先于 spark-submit,因此对于以两种方式设置的任何配置,只有使用 SparkConf().set 设置的才会优先 ()。

我一直在努力实现的是能够控制 spark 配置优先考虑 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)