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
相关产品推荐
相关产品推荐

