记录一下连接sqlserver的过程,遇到的坑太多了,防止忘记
版本
sqlserver版本:
Spark的版本不确定是否对连接过程有影响,反正现在都是用的3.0版本网上的,我就以我目前的版本来说吧。
出现过得坑爹问题
SqlServer的版本很老,这里就有个坑,因为jdk的版本是1.8的341,这个版本的TSL协议1.2,1.3的,而这个版本的SqlServer的TSL协议是1.0,硬要连接会报以下错误:
The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]
查看jdk的版本说明:
根据这个说明,这个版本用的是不支持1.0的,所以得查看以往的版本,直到这个版本的说明:https://www.oracle.com/java/technologies/javase/8u291-relnotes.html
291的版本说1.0和1.1已经被禁用了,那么要用得重装旧版本,但是重新装很麻烦,所以下面这句很重要,可以通过修改这个配置文件来启用TSL1.0,
通过从 java.security 配置文件中的 jdk.tls.disabledStrategies 安全属性中删除“ TLSv1”和/或“ TLSv1.1”来重新启用版本。
找到jdk安装路径下的这个文件:
这里只有jdk.tls.disabledAlgorithms
没有jdk.tls.disabledStrategies
,我感觉没关系,因为整个文件只有这一块有 TLSv1, TLSv1.1
,把他们删掉保存即可
下载JDBC的驱动jar包
https://learn.microsoft.com/zh-cn/sql/connect/jdbc/release-notes-for-the-jdbc-driver?view=sql-server-ver16#previous-releases
这边下载的是9.4的版本,没有新版本是因为后续会报错,一直下载试到这个版本才没有报错,将对应的jar包移动到对应python 环境下(我这的虚拟环境路径如下/export/server/miniconda/envs/pyspark/lib/python3.8/site-packages/pyspark/jars
)
代码实现
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
# SparkSession对象导包,对象是来自于pyspark.sql包中
import time
from pyspark.sql import SparkSession
import os
# 远程调试需要添加环境变量进去
os.environ["JAVA_HOME"] = "/export/server/jdk1.8.0_341"
os.environ['PYSPARK_PYTHON'] = '/export/server/miniconda/envs/pyspark/bin/python'
if __name__ == '__main__':
# 构建SparkSession执行环境入口对象
spark = SparkSession.builder.appName("sqlserver").master("local[*]").getOrCreate()
# config("spark.driver.extraClassPath", "/export/project/02_SQL/database/sqljdbc_10.2/chs/mssql-jdbc-10.2.1.jre8.jar").\
sc = spark.sparkContext
host = "数据库的地址"
user = "用户名"
pwd = "密码"
port = "3433"
database = "数据库名称"
url = "jdbc:sqlserver://" + host + ":" + port + ";databaseName=" + database
# 数据库读出
data = spark.read.format("jdbc"). \
option("url", url). \
option('dbtable', "查看的表格"). \
option("user", user). \
option("password", pwd). \
option("encoding", "ascii"). \
load()
data.show()
如果用高版本的JDCB,则会报以下错误
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target