安装Databricks-connect后如何创建本地SparkSession(无需新建虚拟环境)
Databricks-connect安装后,会通过全局导入钩子、环境变量注入、默认Spark配置覆写的方式,让所有初始化的SparkSession默认指向远端集群。这套劫持逻辑不需要卸载组件、不需要新建虚拟环境,完全可以通过按需重置配置、临时拦截初始化流程的方式绕开,具体可行方案如下:
显式覆盖所有Databricks注入的Spark配置项
直接在构建本地SparkSession时,把Databricks-connect硬编码写入默认配置的集群相关参数全部重置为本地值。如果当前Python进程已经初始化过连接Databricks的Spark实例,需要先停止旧实例,避免SparkContext单例冲突。示例代码:from pyspark.sql import SparkSession # 先停止已存在的远端Spark实例,避免单例冲突 SparkSession.builder.getOrCreate().stop() local_spark = SparkSession.builder \ .master("local[*]") .appName("本地测试Spark") \ .config("spark.remote", "") # 清空Spark 3.4+版本的远端提交地址 .config("spark.databricks.service.address", "") # 清空Databricks服务连接地址 .config("spark.databricks.service.port", "") # 清空Databricks服务连接端口 .getOrCreate()该方式仅对当前代码生成的Spark实例生效,不改动全局环境配置,适合临时需要在本地跑测试任务的场景,注意不要出现
SparkSeesion这类拼写错误,否则会触发未定义变量报错。利用Python模块加载优先级拦截Databricks的自动配置流程
Python解释器启动时会优先加载当前工作目录下的sitecustomize.py文件,且该文件的加载优先级高于全局site-packages目录的同名配置。你可以在运行本地脚本的项目根目录创建该文件,写入逻辑清除Databricks-connect自动注入的连接类环境变量:import os # 移除Databricks-connect自动设置的连接环境变量 for env_name in ["DATABRICKS_ADDRESS", "DATABRICKS_API_TOKEN", "DATABRICKS_CLUSTER_ID", "DATABRICKS_ORG_ID", "DATABRICKS_PORT"]: os.environ.pop(env_name, None)后续正常创建本地SparkSession时,就不会触发Databricks的自动连接逻辑;切回远端集群模式时,只要删除项目目录下的这个文件即可。
临时移除Databricks-connect对pyspark的行为劫持钩子
Databricks-connect对pyspark默认行为的修改,是通过导入阶段注册的元路径查找钩子实现的。你可以在脚本最开头、所有pyspark相关导入执行之前,把这个钩子从Python的导入流程中移除:# 必须放在所有pyspark导入语句之前执行 import sys # 过滤掉Databricks-connect注册的自定义导入查找器 sys.meta_path = [ finder for finder in sys.meta_path if "databricks" not in str(getattr(finder, "__module__", "")).lower() ]该操作不会卸载databricks-connect组件,仅在当前Python进程运行期间关闭其自动劫持逻辑,重启Python解释器后就会自动恢复默认的Databricks连接行为。
内容的提问来源于stack exchange,提问作者Majdi

