2015-12-28 60 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 它不是压倒一切的名字