在Databricks部署Streamlit应用时SparkSession创建问题求助
在Databricks中为Streamlit应用共享SparkSession的解决方案
问题根源
Databricks Notebook本身已初始化全局SparkSession/SparkContext,你手动创建SparkContext(master="local")会与全局上下文冲突,导致报错。另外Streamlit进程独立于Notebook进程,无法直接传递Session对象,必须通过共享Spark配置复用上下文。
正确实现方案
1. 修正Streamlit脚本中的Spark初始化代码
删掉手动创建SparkContext的逻辑,直接复用Databricks的环境配置:
from pyspark.sql import SparkSession # 复用Databricks全局Spark上下文配置创建会话 spark = SparkSession.builder.getOrCreate() # 验证会话状态 print(f"Spark会话已激活: {spark is not None}") print(f"会话应用名称: {spark.sparkContext.appName}")
2. 在Notebook中正确启动Streamlit
启动Streamlit时,确保进程继承Notebook的Spark环境变量,直接用以下命令即可:
!streamlit run myApp.py --server.port 8080
若需要自定义提交参数,可通过环境变量传递:
!export PYSPARK_SUBMIT_ARGS="--master local[*] pyspark-shell" && streamlit run myApp.py
3. 关键注意事项
- 绝对不要调用
sc.stop(),这会销毁Databricks的全局Spark上下文,导致所有后续Spark操作失败。 SparkSession.getActiveSession()返回null是因为Streamlit进程独立,Notebook的活跃会话不会自动传递,必须用getOrCreate()复用配置。- 如需自定义会话配置,基于现有Conf修改即可:
spark = SparkSession.builder \ .config("spark.sql.shuffle.partitions", "20") \ .getOrCreate()
验证方式
在Streamlit脚本中添加简单的Spark操作,确认会话可用:
# 测试读取Databricks内部表 df = spark.sql("SELECT * FROM your_test_table LIMIT 10") df.show()
内容的提问来源于stack exchange,提问作者Spartan101
相关产品推荐
相关产品推荐

