You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux环境下PySpark JDBC连接SQL Server集成安全报错求助

Linux下通过Windows集成安全认证连接SQL Server的可行方案

问题背景

已在Linux服务器上通过ODBC驱动成功访问同域内的SQL Server,但使用Microsoft SQL JDBC驱动时遇到mssql-jdbc_auth.dll加载失败(该文件为Windows专属,无Linux对应.so文件);尝试JTDS驱动但不支持Linux下的Windows集成安全认证,且已通过kinit获取有效Kerberos票据。

环境信息

JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk
LD_LIBRARY_PATH="/home/rapha022/ckd/sqljdbc_12.10/enu/auth/x64/"
JAVA VERSION: jre-1.8.0-openjdk
Python Version: 3.6.8
Spark Version: 3.2.4

核心报错

py4j.protocol.Py4JJavaError: An error occurred while calling o44.jdbc.
: com.microsoft.sqlserver.jdbc.SQLServerException: This driver is not configured for integrated authentication. ClientConnectionId:991210da-e610-4f45-8c8a-b6b665b88b18
...
Caused by: java.lang.UnsatisfiedLinkError: Unable to load authentication DLL mssql-jdbc_auth-12.10.0.x64

解决方案

1. 修正Microsoft JDBC驱动配置,使用纯Java Kerberos认证模式

Microsoft SQL JDBC驱动6.0及以上版本支持纯Java实现的Kerberos认证,无需依赖native库(.dll/.so)。原配置错误在于同时启用integratedSecurity=true(触发native认证)和AuthScheme=JavaKerberos,导致驱动尝试加载Windows专属的dll文件。

修正步骤:

  • 移除冲突参数:删除JDBC URL中的Trusted_Connection=true和integratedSecurity=true,仅保留AuthScheme=JavaKerberos
  • 修正后的JDBC URL:
    jdbc_url = f'jdbc:sqlserver://{server_name}:{port_number};' \
    + f'databaseName={database_name};' \
    + 'Encrypt=false;' \
    + 'TrustServerCertificate=true;' \
    + 'ServerSPN=RestrictedKrbHost/RSP-HR-DB3;' \
    + 'AuthScheme=JavaKerberos;' \
    + f'principal={principal}'
    
  • 清理Spark配置:移除所有指向dll目录的java.library.path配置,纯Java模式不需要native库
  • 验证Kerberos环境:用klist命令确认kinit获取的票据有效,同时确保Linux服务器的/etc/krb5.conf正确配置了域的KDC信息

修正后的Spark启动命令:

spark-submit --driver-class-path "./sqljdbc_12.10/enu/jars/mssql-jdbc-12.10.0.jre8.jar" --jars "./sqljdbc_12.10/enu/jars/mssql-jdbc-12.10.0.jre8.jar" src/extra.py

2. 直接使用ODBC驱动连接(已验证可行)

既然已经能通过ODBC访问数据库,可直接在PySpark中配置ODBC数据源:

示例代码:

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("SQLServerODBC") \
    .getOrCreate()

# 替换为你的ODBC连接字符串,使用ActiveDirectoryIntegrated认证
odbc_url = f"jdbc:odbc:DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server_name};DATABASE={database_name};Authentication=ActiveDirectoryIntegrated;"

df = spark.read.jdbc(url=odbc_url, table="person")
df.show()
spark.stop()

注意事项:

  • 确保Linux服务器安装了支持Kerberos认证的ODBC驱动(如msodbcsql17)
  • 系统Kerberos票据需保持有效(可通过kinit提前获取)

内容的提问来源于stack exchange,提问作者Jesdin Raphael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:19:55