SparkSession没有获取运行时配置

时间:2018-01-02 03:01:40

标签: scala apache-spark apache-spark-sql configuration-files

在我的应用程序中,我创建了一个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执行程序完全运行..

1 个答案:

答案 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)

使用configSparkSession.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.enabledspark.shuffle.service.enabledspark.dynamicAllocation.minExecutors

另一方面,

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

spark.sparkContext.hadoopConfiguration.set("some.hadoop.property", "some_value")