You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过编程方式从Databricks集群分离Notebook?

编程方式清理Databricks闲置Notebook会话

核心思路:Databricks中Notebook连接集群会创建INTERACTIVE类型的run,只要这类run存在,集群就会保持活跃。我们可以通过API/CLI/SDK找到并终止闲置的这类run,实现Notebook与集群的分离,释放内存并让集群能触发自动终止。

1. 使用Databricks REST API

步骤:

  • 先获取目标集群ID:
    curl -n -X GET https://<你的Databricks实例域名>/api/2.0/clusters/list \
      | jq '.clusters[] | select(.cluster_name == "你的共享集群名称") | .cluster_id'
    
  • 列出集群上所有运行中的交互式会话:
    curl -n -X GET https://<你的Databricks实例域名>/api/2.0/clusters/list-runs?cluster_id=<集群ID> \
      | jq '.runs[] | select(.run_type == "INTERACTIVE" and .state.life_cycle_state == "RUNNING") | {run_id: .run_id, 启动时间: .start_time, 用户: .user_name}'
    
  • 终止指定闲置会话:
    curl -n -X POST https://<你的Databricks实例域名>/api/2.0/clusters/terminate-run \
      -d '{"cluster_id": "<集群ID>", "run_id": "<要终止的Run ID>"}'
    

2. 使用Databricks CLI

先通过databricks configure完成实例URL和Token的配置,然后执行以下命令:

  • 获取集群ID:
    databricks clusters list --output json | jq '.clusters[] | select(.cluster_name == "你的共享集群名称") | .cluster_id'
    
  • 列出运行中的交互式会话:
    databricks clusters list-runs --cluster-id <集群ID> --output json | jq '.runs[] | select(.run_type == "INTERACTIVE" and .state.life_cycle_state == "RUNNING")'
    
  • 终止闲置会话:
    databricks clusters terminate-run --cluster-id <集群ID> --run-id <要终止的Run ID>
    

3. 使用Python SDK(自动化首选)

用官方的databricks-sdk写定时清理脚本,适合长期自动化运维:

安装SDK:

pip install databricks-sdk

示例脚本:

from databricks.sdk import WorkspaceClient
from datetime import datetime, timedelta

# 初始化客户端
w = WorkspaceClient(host="https://<你的Databricks实例域名>", token="<你的个人访问Token>")

# 配置参数
TARGET_CLUSTER_NAME = "你的共享集群名称"
IDLE_THRESHOLD_HOURS = 1  # 闲置超过1小时的会话将被终止

# 获取目标集群ID
cluster = next(c for c in w.clusters.list() if c.cluster_name == TARGET_CLUSTER_NAME)
cluster_id = cluster.cluster_id

# 遍历并终止闲置会话
current_time = datetime.now()
for run in w.clusters.list_runs(cluster_id=cluster_id):
    if run.run_type == "INTERACTIVE" and run.state.life_cycle_state == "RUNNING":
        run_start_time = datetime.fromtimestamp(run.start_time / 1000)
        idle_duration = current_time - run_start_time
        if idle_duration > timedelta(hours=IDLE_THRESHOLD_HOURS):
            w.clusters.terminate_run(cluster_id=cluster_id, run_id=run.run_id)
            print(f"已终止闲置会话:Run ID {run.run_id},所属用户 {run.user_name},闲置时长 {idle_duration}")

额外优化建议

  • 把Python脚本做成Databricks定时Job,每天定时清理,完全自动化。
  • 配合集群的「闲置自动终止」设置:清理完闲置会话后,若集群无活跃任务,就会自动终止,进一步节省资源。
  • 若需要更精准的闲置判断(比如基于Notebook最后操作时间),可以结合Spark UI的REST API获取会话的活跃指标,但复杂度会更高,常规场景用启动时间判断足够。

内容的提问来源于stack exchange,提问作者George Sotiropoulos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:25:35