我这些天学习Spark,但我对Spark配置感到有些困惑。 AFAIK,至少有3种配置方式:
./bin/spark-submit --class <main-class> --master xxx --deploy-mode xxx --conf key=value
为什么有这么多方法可以做到,有什么区别?这是最好的做法吗?
答案 0 :(得分:1)
直接回答您的问题:
当您希望重要参数永远不会改变且不依赖于硬件时,您可以在源代码中使用配置 - 例如conf.set("spark.eventLog.enabled", "true")
(虽然,可以说,你可能会把这个特定的一个留在源代码中 - 它可以说是在属性文件中,第三个选项在这里)
您对从运行到运行更改的参数使用命令行选项 - 例如driver-memory
或executor-cores
- 您希望根据您运行它的硬件(或调整时)来更改 - 所以这样的配置不应该在您的源代码中
当配置设置不经常更改时,您在属性文件中使用配置 - 例如如果您始终使用相同的硬件配置来运行应用程序,则可以在属性文件中定义spark.driver.memory
(模板位于$ SPARK_HOME的conf目录中)
答案 1 :(得分:0)
Spark遵循用于设置配置的层次结构。您已经发现有很多方法可以设置令人困惑的配置。以下是spark用于进行配置的层次结构。
因此,举个例子,让我们创建一个简单的Spark应用程序
val conf = new SparkConf()
conf.setAppName("InCodeApp")
val sc = new SparkContext(conf)
如果您要运行此应用程序并尝试覆盖代码中设置的应用程序名称:
spark-submit --name "CLI App" myApp.jar
运行此应用程序时,应用程序名称为&#34; InCodeApp&#34;
由于这种层次结构,我发现最好将mosy属性设置为命令行,但不应更改的配置除外(如设置推测或kryo)。
答案 2 :(得分:0)
我遵循的几条规则:
1)避免 spark-env.sh 中的任何 SPARK_CAPITAL_LETTER_SHOUTING_AT_YOU 配置参数,因为它们在某些情况下似乎不起作用
2)更喜欢来自 spark-defaults.conf
的 spark.nice.and.calm.lower.case 配置参数3)对于任何非显而易见或特定于工作的事情,创建一个脚本并明确地将命令行 - spark.config.params 传递给spark-submit调用以突出显示这些
答案 3 :(得分:0)
spark-submit --name“CLI App”myApp.jar 它没有覆盖名称