使用Python、ODBC Simba驱动及Azure AD服务主体连接Azure Databricks报错求助
操作指引及问题修复方案
现有代码问题排查
你遇到的DSCurlRecvError报错通常由认证参数配置错误、令牌无效或者连接参数不匹配导致,现有代码的核心错误如下:
- 拼写错误:变量名
cliend_id应为client_id,AuthenticationContext构造函数末尾缺少右括号,token.get('accessToken')调用末尾缺少右括号 - 认证库过时:ADAL库已被微软正式废弃,对新版Azure AD端点兼容性存在缺陷,建议替换为MSAL库
- 连接参数错误:Simba ODBC驱动的访问令牌传递参数为
AccessToken,不存在Auth_AccessToken、Auth_Flow参数 - 令牌资源错误:获取Azure AD令牌时的资源参数必须固定为
2ff814a6-3e0b-4ab1-a560-142d83053c80(Azure Databricks官方应用ID),否则获取的令牌无法用于Databricks认证
前置配置要求
- 服务主体已添加到Azure Databricks工作区,并分配了对应集群/ SQL仓库的访问权限
- 已安装最新版Simba Spark ODBC驱动,
libsparkodbc_sb64.so路径配置正确 - 运行环境可正常访问Databricks工作区域名的443端口,无防火墙/代理拦截
可运行参考代码
import os import msal import pyodbc # 配置参数 TENANT_ID = "你的Azure AD租户ID" CLIENT_ID = "服务主体的应用ID" CLIENT_SECRET = "服务主体的客户端密钥" DRIVER_PATH = os.getenv("SIMBA_DRIVER", "libsparkodbc_sb64.so的完整路径") DATABRICKS_HOST = "你的工作区域名,例如xxx.azuredatabricks.net,不要带https前缀" HTTP_PATH = "集群或SQL仓库的HTTP路径" # 初始化MSAL客户端获取令牌 msal_authority = f"https://login.microsoftonline.com/{TENANT_ID}" msal_app = msal.ConfidentialClientApplication( client_id=CLIENT_ID, client_credential=CLIENT_SECRET, authority=msal_authority ) # Databricks固定资源ID scopes = ["2ff814a6-3e0b-4ab1-a560-142d83053c80/.default"] token_result = msal_app.acquire_token_for_client(scopes=scopes) if "access_token" not in token_result: raise Exception(f"获取令牌失败:{token_result.get('error_description')}") # 构造ODBC连接字符串 odbc_conn_str = ( f"Driver={DRIVER_PATH};" f"Host={DATABRICKS_HOST};" "PORT=443;" f"HTTPPath={HTTP_PATH};" "AuthMech=11;" f"AccessToken={token_result['access_token']};" "SSL=1;" "ThriftTransport=2;" ) # 测试连接 with pyodbc.connect(odbc_conn_str, autocommit=True) as conn: with conn.cursor() as cursor: cursor.execute("SELECT current_user()") print(cursor.fetchone())
额外排查点
- 若仍报错可开启ODBC驱动日志,在连接字符串中添加
LogLevel=6;LogPath=/tmp/odbc.log查看详细错误信息 - 确认服务主体没有被Azure AD禁用,权限配置没有过期
- 每次新建连接前重新获取令牌,避免令牌过期导致认证失败
内容的提问来源于stack exchange,提问作者kamroj
相关产品推荐
相关产品推荐

