2016-10-21 89 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