Databricks集群从10.4 LTS升级到12.2 LTS后自定义保活机制兼容性问题咨询
Databricks集群从10.4 LTS升级到12.2 LTS后自定义保活机制兼容性问题咨询
最近把Databricks集群从10.4 LTS升级到12.2 LTS后,之前用的自定义集群保活机制突然失效了,折腾了好一阵没搞定,来这里请教下各位大佬!
先给大家说下我们的场景:我们在Azure机器学习VM上部署Python代码,这些代码会远程连接到Databricks集群。为了让多个算法共享资源、降低成本,我们用了一个共享集群,还设置了10分钟无活动自动终止的配置。但有些算法需要Spark会话保持超过10分钟,大部分时候我们会把DataFrame写入临时表或文件之后再重新加载,但偶尔直接保持会话、让DataFrame驻留内存会更高效。
之前为了应对这个需求,我们写了一个后台线程,每隔9分钟就给集群发一次ping请求来维持活动状态,代码大概是这样的:
import threading import time import logging if keep_alive: # 启动后台线程保持Spark会话活跃 self._keep_spark_alive_thread = threading.Thread( target=self._keep_spark_alive, args=(self.spark,), daemon=True ) self._keep_spark_alive_thread.start() def _keep_spark_alive(self, spark): while True: try: # 执行简单SQL触发集群活动 spark.sql("SELECT 1").collect() time.sleep(540) # 间隔9分钟 except Exception as e: logging.warning(f"Spark保活操作失败: {str(e)}") break
结果升级到12.2 LTS之后,这个保活机制完全不管用了,集群还是会在10分钟无活动后自动终止。有没有大佬遇到过类似的问题?或者知道12.2 LTS里关于集群活动检测的逻辑有什么变化吗?
我自己琢磨的几个可能原因
- 活动判定标准变了:Databricks 12.2 LTS可能调整了集群“活动”的定义,单纯执行
SELECT 1这种轻量SQL可能不再被算作有效活动,或者这类操作的活动标记时效变短了,撑不到下一次ping。 - 远程会话的跟踪逻辑改了:升级后,从AML VM发起的远程会话可能和集群的活动跟踪逻辑解耦了,线程里的ping操作可能没关联到主会话,所以集群还是认为主会话处于无活动状态。
- 线程生命周期管理变化:虽然设置了
daemon=True,但12.2 LTS对线程的管理可能有调整,导致保活线程提前退出,没法持续执行ping操作。
目前想到的几个解决方案
- 换一种保活操作:试试执行更有“存在感”的Spark操作,比如读取一小段集群上的表数据,或者创建临时视图再删除,确保操作能被集群的活动检测系统识别。比如:
def _keep_spark_alive(self, spark): while True: try: # 用更明确的操作触发活动 temp_df = spark.range(1) temp_df.createOrReplaceTempView("keep_alive_temp_view") spark.sql("SELECT * FROM keep_alive_temp_view").collect() spark.catalog.dropTempView("keep_alive_temp_view") time.sleep(540) except Exception as e: logging.warning(f"Spark保活操作失败: {str(e)}") break - 查官方版本变更说明:打算去翻12.2 LTS的release notes,看看集群自动终止、会话活动检测这块有没有什么更新,说不定官方已经提供了更可靠的保活方式。
- 临时调整自动终止时长:目前先把集群自动终止时间调长到算法需要的时长,同时监控集群的实际使用情况,后续再结合官方方案优化。
- 排查集群终止日志:去Databricks集群的事件日志里看看,集群终止时的具体原因是什么,是明确的“无活动”还是其他问题,这应该能帮我定位根源。
有没有朋友在升级到12.2 LTS后遇到过类似的保活问题?或者有其他更靠谱的解决思路,欢迎分享!
备注:内容来源于stack exchange,提问作者BeGreen
相关产品推荐
相关产品推荐

