2015-12-28 56 views
0

我最近在學Spark,但我對Spark配置有點困惑。 AFAIK,至少有3種方式配置:通過環境變量,命令行參數或代碼設置Spark配置?

  1. 環境變量,http://spark.apache.org/docs/latest/spark-standalone.html
  2. 的命令行參數,如./bin/spark-submit --class <main-class> --master xxx --deploy-mode xxx --conf key=value
  3. 代碼,像斯卡拉/ Java代碼。

爲什麼有這麼多的方式來做到這一點,有什麼區別?對此有最佳做法嗎?

回答

0

Spark遵循設置配置的層次結構。你已經發現,有很多方法可以設置令人困惑的配置。這是火花用於配置的層次結構。

  1. 設置在上CONF或上下文
  2. 在運行時通過命令行
  3. 在運行時通過了從由--properties文件中指定的配置文件的代碼
  4. 火花的env默認

因此,對於一個例子,讓我們創建一個簡單的應用程序星火

val conf = new SparkConf() 
conf.setAppName("InCodeApp") 
val sc = new SparkContext(conf) 

如果你運行該應用程序並嘗試在此改變應用程序的名稱在代碼中設置:

spark-submit --name "CLI App" myApp.jar 

當你運行該應用程序,該應用程序的名稱將是因爲這個層次的「InCodeApp」

,我發現最好是在命令行中設置mosy屬性,除了不應該改變的配置外(例如設置猜測或kryo)。我跟着

0

夫婦規則:

1)避免任何SPARK_CAPITAL_LETTER_SHOUTING_AT_YOU配置則params的從spark-env.sh,因爲他們似乎並不在某些情況下工作

2)喜歡,相反,spark.nice.and.calm.lower.case配置PARAMS從火花defaults.conf

3)任何非明顯或特定工作,創建一個腳本,並明確通過在命令行中--spark.config.params火花提交調用來突出這些

1

直接回答你的問題:

  • 當你期望你的重要參數永遠不會改變而不依賴於硬件時,你使用源代碼中的配置 - 例如conf.set("spark.eventLog.enabled", "true")(雖然可以說,你可能會離開源代碼 - 它可以說是屬性文件中的第三個選項)

  • 你使用命令行選項來改變從運行到運行的參數 - 例如driver-memoryexecutor-cores - 你希望你根據上運行其硬件(或同時調整),這改變 - 所以這樣的配置不應該在你的源代碼

  • 您使用配置的屬性文件時的配置設置不要經常改變 - 例如如果你總是使用相同的硬件配置來運行你的應用程序,你可以在屬性文件中定義spark.driver.memory(模板是在$ SPARK_HOME的conf目錄)

+0

這是一個grate的解釋,所以:source code - application config;命令行 - 爲運行指定; env var - 硬件/環境 –

0

火花提交--name「CLI應用「myApp.jar 它不是壓倒一切的名字