在我的应用程序中,我正在创建一个 SparkSession
对象,然后尝试读取我的属性文件并在运行时设置属性。但它没有选择我在运行时传递的属性。
我正在以 YARN 集群模式提交我的应用程序
这是我在 Trait 中创建的初始 Spark session 对象
val spark = SparkSession.builder().appName("MyApp").enableHiveSupport().getOrCreate()
然后在对象内部的主函数中,我扩展了这个 Trait,所以我的 spark session 在 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)
所以理想情况下,我的应用程序必须从 40 个执行程序开始,但它正在启动,然后完全使用默认的 2 个执行程序运行..
最佳答案
这里没有什么意外。只能在运行时设置 Spark SQL 属性的某些子集(以 spark.sql
为前缀)(请参阅 SparkConf
文档):
Once a SparkConf object is passed to Spark, it is cloned and can no longer be modified by the user. Spark does not support modifying the configuration at runtime.
其余选项必须在
SparkContext
之前设置被初始化。意思是初始化SparkSession
与 SparkContext
:val conf: SparkConf = ... // Set options here
val sc = SparkContext(conf)
val spark = SparkSession(sc)
与
config
SparkSession.Builder
的方法和 SparkConf
val conf: SparkConf = ... // Set options here
val spark = SparkSession.builder.config(conf).getOrCreate
或键值对:
val spark = SparkSession.builder.config("spark.some.key", "some_value").getOrCreate
这尤其适用于
spark.dynamicAllocation.enabled
,spark.shuffle.service.enabled
和 spark.dynamicAllocation.minExecutors
.mapreduce.input.fileinputformat.input.dir.recursive
另一方面,是 Hadoop 配置的属性,而不是 Spark,应该在那里设置:spark.sparkContext.hadoopConfiguration.set("some.hadoop.property", "some_value")
关于scala - SparkSession 不接受运行时配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48055133/