Spark Session复用配置疑问:文档描述与实际测试不符?
关于第一个疑问
当应用2复用应用1的SparkSession时,spark.sql.shuffle.partitions不会从20更新为30。
原因在于Spark对配置的生效时机有明确区分:spark.sql.shuffle.partitions属于会话初始化阶段确定的配置,不属于警告中提到的「runtime SQL configurations」范畴。这类配置一旦Session启动完成,就无法通过SparkSession.builder.getOrCreate()的方式修改。
至于是否违背直觉——其实这种设计是合理的:SparkSession作为计算会话的核心载体,需要保证运行中的配置稳定性。如果允许后续代码随意修改shuffle分区数,会导致同一Session内不同任务的shuffle逻辑不一致,引发数据分片混乱、结果异常等问题,反而不符合生产环境的一致性要求。
关于第二个疑问
文档描述和实际测试的差异,核心是对「配置选项」的范围理解偏差:
Spark官方文档中提到的「构建器中指定的配置选项将应用于现有SparkSession」,仅针对支持runtime修改的SQL配置,而非所有配置项。而spark.sql.shuffle.partitions并不在这个可runtime修改的列表里。
你看到的警告「WARN SparkSession: Using an existing Spark session; only runtime SQL configurations will have an impact」已经明确给出了提示——只有runtime SQL配置会生效,其他配置(包括spark.sql.shuffle.partitions)通过builder设置不会对现有Session产生影响,所以你调用getAll()返回的还是最初的20。
如果需要在Session启动后修改spark.sql.shuffle.partitions,可以直接使用spark.conf.set("spark.sql.shuffle.partitions", 30),这种方式修改的配置会对后续提交的SQL查询生效,但注意:已经在执行的任务不会受影响。
内容的提问来源于stack exchange,提问作者Matthew

