在群集模式下使用spark-submit共享配置文件

时间:2016-10-21 14:35:33

标签: apache-spark spark-streaming yarn

我一直在"客户"开发期间的模式。我使用" - file"与执行程序共享配置文件。 Driver正在本地读取配置文件。现在我想在" cluster"中部署作业。模式。我现在无法与驱动程序共享配置文件。

例如,我将配置文件名称作为extraJavaOptions传递给驱动程序和执行程序。我正在使用SparkFiles.get()

读取文件
  val configFile = org.apache.spark.SparkFiles.get(System.getProperty("config.file.name"))

这对执行程序很有效,但在驱动程序上失败。我认为文件只与执行程序共享,而不是与运行驱动程序的容器共享。 一种选择是将配置文件保存在S3中。我想检查一下是否可以使用spark-submit实现。

> spark-submit --deploy-mode cluster --master yarn --driver-cores 2
> --driver-memory 4g --num-executors 4 --executor-cores 4 --executor-memory 10g \
> --files /home/hadoop/Streaming.conf,/home/hadoop/log4j.properties \
> --conf **spark.driver.extraJavaOptions**="-Dlog4j.configuration=log4j.properties
> -Dconfig.file.name=Streaming.conf" \
> --conf **spark.executor.extraJavaOptions**="-Dlog4j.configuration=log4j.properties
> -Dconfig.file.name=Streaming.conf" \
> --class ....

2 个答案:

答案 0 :(得分:2)

您需要在Spark submit命令中尝试--properties-file选项。

例如属性文件内容

spark.key1=value1
spark.key2=value2

所有密钥必须为prefixed spark

然后使用这样的spark-submit命令传递属性文件。

bin/spark-submit --properties-file  propertiesfile.properties

然后在代码中,您可以使用以下sparkcontext getConf方法获取密钥。

sc.getConf.get("spark.key1")  // returns value1

获得关键值后,您可以随处使用它。

答案 1 :(得分:1)

我在this帖子中找到了解决此问题的方法。

您可以通过在末尾添加'#alias'来为您通过--files提交的文件提供别名。通过这个技巧,您应该能够通过别名访问文件。

例如,以下代码可以无错误地运行。

spark-submit --master yarn-cluster --files test.conf#testFile.conf test.py

以test.py为:

path_f = 'testFile.conf'
try:
    f = open(path_f, 'r')
except:
    raise Exception('File not opened', 'EEEEEEE!')

和一个空的test.conf