Synapse写入PySpark DataFrame到SQL库报KrbException找不到默认域错误
问题根因
KrbException: Cannot locate default realm报错的触发逻辑非常明确:
- 你在JDBC URL中配置了
Authentication=ActiveDirectoryIntegrated(Windows AD集成认证),该模式会在运行时尝试加载本地Kerberos客户端配置,读取默认域信息完成认证。 - Azure Synapse Spark池的运行节点是未加入AD域的Linux托管节点,默认没有配置
krb5.confKerberos配置文件,自然无法定位默认域。 - 你代码中添加的
forwardSparkAzureStorageCredentials配置项仅对Azure存储连接器、Synapse专用SQL池官方连接器生效,原生开源JDBC连接器无法识别该参数,反而会干扰认证流程,加剧报错概率。
这个问题在Databricks环境出现的逻辑完全一致:Databricks的运行节点同样是未加入AD域的Linux节点,直接用ActiveDirectoryIntegrated模式走JDBC连接Azure SQL/Synapse SQL都会触发相同报错。
解决方案
根据你的场景选以下任意一种方案即可,优先推荐方案1或方案3,稳定性最高。
- 方案1:改用SQL账号认证(最简便,无额外配置)
删掉JDBC URL中的Authentication=ActiveDirectoryIntegrated参数,替换为SQL账号的用户名密码,同时删除无效的forwardSparkAzureStorageCredentials配置,参考代码如下:from pyspark.sql import Row test = spark.createDataFrame([Row("Sarah", 28), Row("Anne", 5)], ["Name", "Age"]) test.write\ .format("jdbc")\ .option("url", "jdbc:sqlserver://XXXX.sql.azuresynapse.net:1433;database=azlsynddap001;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.sql.azuresynapse.net;loginTimeout=30;user=你的SQL认证用户名;password=你的SQL认证密码")\ .option("dbtable", "test_CP")\ .save() - 方案2:改用AAD服务主体认证(需要保留AAD认证时使用)
不要用集成认证,提前在目标Synapse SQL库中给AAD服务主体分配对应表的写入权限,将JDBC URL中的认证参数替换为服务主体模式,同样删除无效的存储凭据转发配置,参数格式如下:Authentication=ActiveDirectoryServicePrincipal;user=<服务主体客户端ID>@<AAD租户ID>;password=<服务主体客户端密钥> - 方案3:改用Synapse官方专用SQL连接器(性能最优,支持凭据转发)
不要使用原生开源JDBC连接器,换用Synapse环境内置的专用SQL池连接器,该连接器原生支持forwardSparkAzureStorageCredentials参数,走PolyBase做数据写入,性能远高于原生JDBC,也不会触发Kerberos相关报错,注意需要额外配置临时目录用于数据中转,参考代码如下:from pyspark.sql import Row test = spark.createDataFrame([Row("Sarah", 28), Row("Anne", 5)], ["Name", "Age"]) test.write\ .format("com.databricks.spark.sqldw")\ .option("url", "jdbc:sqlserver://XXXX.sql.azuresynapse.net:1433;database=azlsynddap001;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.sql.azuresynapse.net;loginTimeout=30")\ .option("forwardSparkAzureStorageCredentials", "true")\ .option("dbTable", "test_CP")\ .option("tempDir", "abfss://你的容器名@你的ADLS存储账户名.dfs.core.windows.net/sqldw_temp/")\ .save()
注意事项
原生JDBC连接器不识别forwardSparkAzureStorageCredentials参数,非官方Synapse连接器场景下不要添加该配置,否则会触发不可预期的认证错误。
内容的提问来源于stack exchange,提问作者Quynh-Mai Chu
相关产品推荐
相关产品推荐

