Spark newSession()是否继承父会话配置?SQLConf与SparkContext解析
Spark中
newSession()的配置继承规则与SQLConf、SparkContext区别解析 核心结论
使用newSession()创建的新SparkSession不会继承父会话的动态配置(通过conf.set()设置)以及Builder阶段的SQL专属配置,但会共享SparkContext层面的全局配置、SparkContext实例本身,以及表缓存。
SQLConf与SparkContext的本质区别
- SparkContext:是整个Spark应用的核心全局上下文,负责管理应用的底层资源(集群连接、任务调度、内存/CPU分配等)。它的配置是全局生效的,所有会话共享,比如
spark.executor.cores、spark.driver.memory这类资源相关配置,一旦设置就对整个应用内的所有会话有效,无法在单个会话中单独修改。 - SQLConf:是每个SparkSession专属的配置容器,专门管理SQL查询相关的会话级行为配置,比如
spark.sql.shuffle.partitions、spark.sql.sources.default这类仅影响SQL执行逻辑的参数。每个SparkSession拥有独立的SQLConf实例,修改某一个会话的SQLConf不会对其他会话产生影响。
结合测试结果解析
你的Databricks测试结果完全符合上述规则:
- Session-1:通过Builder设置
spark.sql.sources.default(SQL专属配置),又通过conf.set()设置spark.sql.shuffle.partitions(动态SQL会话配置),这两个配置都存储在Session-1的独立SQLConf中。 - Session-2:通过
newSession()创建后,会生成全新的SQLConf实例,默认加载系统/集群的默认配置(spark.sql.sources.default为delta、spark.sql.shuffle.partitions为200),不会继承Session-1的SQLConf配置。 - Session-3:修改自身的
spark.sql.shuffle.partitions为333,仅对Session-3的SQLConf生效,不会影响Session-1或Session-2的配置,进一步验证了SQLConf的独立性。
补充:哪些内容会被新会话共享?
- SparkContext实例:所有由
newSession()创建的会话共享同一个SparkContext,因此资源类全局配置在所有会话中保持一致。 - 表缓存:如果父会话中缓存了表(如
spark_session_1.cacheTable("my_table")),新会话可以直接读取缓存数据,无需重新计算,因为表缓存是绑定在SparkContext上的全局资源。
内容的提问来源于stack exchange,提问作者user16798185
相关产品推荐
相关产品推荐

