2016-10-21 90 views
3

在开发过程中,我一直在“客户端”模式下运行我的spark工作。我使用“--file”与执行程序共享配置文件。驱动程序在本地读取配置文件。现在我想以“集群”模式部署作业。我现在无法与驱动程序共享配置文件。在集群模式下使用spark-submit共享配置文件

例如,我将配置文件名称作为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 .... 

回答

1

您需要尝试Spark提交命令中的--properties-file选项。

例如属性文件内容

spark.key1=value1 
spark.key2=value2 

所有按键必须prefixedspark

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

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

然后在代码中你可以使用下面sparkcontext getConf方法的关键。

​​

一旦你获得了关键值,你就可以在任何地方使用它。

+1

感谢您的回应! 我已经有另一种格式的配置文件(typesafe配置)。保持配置组织而不是将它们作为KV对放在文件中有几个优点。 没有办法让我的配置文件与驱动程序共享吗? – Cheeko

+0

@Cheeko:你是什么意思分享conf文件到驱动程序? conf文件中有什么?同样,如果你可以阅读执行者,为什么不读你的驱动程序?读取驱动程序中的相同内容并将其作为广播变量传递给执行程序..因此,您可以在两个位置使用它。 – Shankar

+0

配置文件不在所有节点都可访问的位置。所以我使用spark-submit和--files将文件传递给所有执行者。它看起来像 - 文件没有传递给驱动程序,该驱动程序以“集群”模式运行另一个节点。 – Cheeko