SparkSession 不接受运行时配置

AJm*_*AJm 4 scala configuration-files apache-spark apache-spark-sql

在我的应用程序中,我正在创建一个SparkSession对象,然后尝试读取我的属性文件并在运行时设置属性。但它没有选择我在运行时传递的属性。

我正在以 YARN 集群模式提交我的应用程序

这是我在 Trait 中创建的初始 Spark 会话对象

val spark = SparkSession.builder().appName("MyApp").enableHiveSupport().getOrCreate()
Run Code Online (Sandbox Code Playgroud)

然后在对象内部的主函数中,我扩展了这个 Trait,所以我的 spark 会话在 Trait 和我的对象(包含 main)中初始化,我正在设置:

spark.conf.set(spark.sql.hive.convertMetastoreParquet, false)
spark.conf.set(mapreduce.input.fileinputformat.input.dir.recursive,true)
spark.conf.set(spark.dynamicAllocation.enabled, true)
spark.conf.set(spark.shuffle.service.enabled, true)
spark.conf.set(spark.dynamicAllocation.minExecutors,40)
Run Code Online (Sandbox Code Playgroud)

所以理想情况下,我的应用程序必须从 40 个执行程序开始,但它正在启动,然后完全使用默认的 2 个执行程序运行..

use*_*207 5

这里没有什么意外。只能spark.sql在运行时设置Spark SQL 属性的某些子集(以 为前缀)(请参阅SparkConf文档):

一旦 SparkConf 对象被传递给 Spark,它就会被克隆并且不能再被用户修改。Spark 不支持在运行时修改配置。

其余选项必须在SparkContext初始化之前设置。这意味着initalizingSparkSessionSparkContext

val conf: SparkConf = ...   // Set options here
val sc  = SparkContext(conf)
val spark  = SparkSession(sc)
Run Code Online (Sandbox Code Playgroud)

config的方法SparkSession.BuilderSparkConf

val conf: SparkConf = ...   // Set options here
val spark = SparkSession.builder.config(conf).getOrCreate
Run Code Online (Sandbox Code Playgroud)

或键值对:

val spark = SparkSession.builder.config("spark.some.key", "some_value").getOrCreate
Run Code Online (Sandbox Code Playgroud)

这尤其适用于spark.dynamicAllocation.enabledspark.shuffle.service.enabledspark.dynamicAllocation.minExecutors

mapreduce.input.fileinputformat.input.dir.recursive 另一方面,是 Hadoop 配置的属性,而不是 Spark,应该在那里设置:

spark.sparkContext.hadoopConfiguration.set("some.hadoop.property", "some_value")
Run Code Online (Sandbox Code Playgroud)