能否通过编程方式从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
相关产品推荐
相关产品推荐

