如何无需重启Dash应用重新建立Databricks Connect连接?
解决Databricks Connect会话过期后在Dash应用内恢复连接的问题
核心问题原因
你遇到的session_id is no longer usable错误是因为Databricks Connect会话因闲置超时被回收,而Spark Connect不支持newSession()方法(该方法依赖JVM,而Spark Connect客户端无JVM运行环境)。
正确的会话恢复流程
无需使用spark.newSession(),直接通过以下步骤重建有效会话:
- 调用
spark.stop()关闭已失效的旧会话 - 重新初始化Databricks会话实例
代码实现示例
1. 封装会话验证与重建逻辑
from grpc import StatusCode from grpc._channel import _InactiveRpcError from databricks.connect import DatabricksSession # 全局Spark会话变量 spark = DatabricksSession.builder.serverless().getOrCreate() def get_valid_spark_session(): global spark try: # 执行简单查询验证会话有效性 spark.sql("SELECT 1").collect() return spark except _InactiveRpcError as e: if e.code() == StatusCode.FAILED_PRECONDITION: # 会话失效,重建连接 spark.stop() spark = DatabricksSession.builder.serverless().getOrCreate() return spark # 其他GRPC异常直接抛出 raise
2. 在Dash回调中使用验证后的会话
import dash from dash import dcc, html, Input, Output, callback import plotly.express as px app = dash.Dash(__name__) # Dash布局示例 app.layout = html.Div([ dcc.Dropdown(id='category-dropdown', options=['A', 'B', 'C'], value='A'), dcc.Graph(id='data-graph') ]) @callback( Output('data-graph', 'figure'), Input('category-dropdown', 'value') ) def update_graph(selected_category): # 获取有效会话 spark = get_valid_spark_session() # 执行数据查询 query = f"SELECT category, count FROM demo_table WHERE category = '{selected_category}'" df = spark.sql(query).toPandas() # 生成Plotly图表 return px.bar(df, x='category', y='count') if __name__ == '__main__': app.run_server(debug=True)
额外建议
- 可在Databricks控制台调整计算资源的闲置超时时间,降低会话过期频率,但无法完全避免,因此自动重建逻辑是必要的
- 每次数据查询前通过验证函数获取有效会话,避免长期持有失效实例导致的异常
内容的提问来源于stack exchange,提问作者Carson Grose
相关产品推荐
相关产品推荐

