Azure Synapse Notebook中PySpark通过AD集成认证连接Azure SQL DB报错求助
问题分析与解决方案
你遇到的IllegalArgumentException: KrbException: Cannot locate default realm错误,本质是PySpark尝试通过Kerberos协议完成AD集成认证,但Azure Synapse Notebook环境未配置Kerberos默认域。而Synapse连接Azure SQL DB的AD集成认证有专门的实现逻辑,无需依赖本地Kerberos配置,以下是修正后的正确连接方案:
方案1:使用spark.read.format配置AD认证参数
根据你的身份类型(Synapse托管身份/当前AD用户)选择对应配置:
子方案A:用Synapse托管身份(MSI)认证
df = spark.read.format("jdbc") \ .option("url", "jdbc:sqlserver://<你的SQL服务器名>.database.windows.net:1433;database=<你的数据库名>") \ .option("dbtable", "<目标表名>") \ .option("authentication", "ActiveDirectoryMSI") \ .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") \ .load()
子方案B:用当前登录用户的AD集成身份认证
df = spark.read.format("jdbc") \ .option("url", "jdbc:sqlserver://<你的SQL服务器名>.database.windows.net:1433;database=<你的数据库名>") \ .option("dbtable", "<目标表名>") \ .option("authentication", "ActiveDirectoryIntegrated") \ .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") \ .load()
方案2:拼接jdbcUrl使用spark.read.jdbc方法
同样需要在URL中明确指定AD认证方式,避免触发Kerberos自动协商:
用MSI认证的URL示例
jdbc_url = "jdbc:sqlserver://<你的SQL服务器名>.database.windows.net:1433;database=<你的数据库名>;authentication=ActiveDirectoryMSI" df = spark.read.jdbc(url=jdbc_url, table="<目标表名>", driver="com.microsoft.sqlserver.jdbc.SQLServerDriver")
用AD集成身份的URL示例
jdbc_url = "jdbc:sqlserver://<你的SQL服务器名>.database.windows.net:1433;database=<你的数据库名>;authentication=ActiveDirectoryIntegrated" df = spark.read.jdbc(url=jdbc_url, table="<目标表名>", driver="com.microsoft.sqlserver.jdbc.SQLServerDriver")
关键注意事项
- 若使用MSI认证:需将Synapse工作区的托管身份添加到Azure SQL DB的AD用户/组中,并授予对应数据库权限(如
db_datareader)。 - 若使用交互式AD身份:你的用户账号需拥有Azure SQL DB的访问权限,且当前Notebook会话以该账号登录。
- 无需手动配置Kerberos域,Synapse环境中AD认证由JDBC驱动的专属逻辑处理,与本地Kerberos配置无关。
内容的提问来源于stack exchange,提问作者Maryan Oksentyuk
相关产品推荐
相关产品推荐

