在我的应用程序中,我创建了一个SparkSession
对象,然后尝试读取我的属性文件并在运行时设置属性。但它没有拿起我在运行时传递的属性。
我在YARN群集模式下提交我的应用
这是我在Trait中创建的初始Spark会话对象
val spark = SparkSession.builder().appName("MyApp").enableHiveSupport().getOrCreate()
然后在我的主要功能中,我正在扩展这个特性,所以我的火花会话在Trait和我的对象(包含主要)中初始化我设置了这个:
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执行程序完全运行..
答案 0 :(得分:4)
这里没有任何意外。只能在运行时设置Spark SQL属性的某些子集(前缀为spark.sql
)(请参阅SparkConf
文档):
将SparkConf对象传递给Spark后,它将被克隆,用户无法再对其进行修改。 Spark不支持在运行时修改配置。
必须在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")