Azure Databricks连接MongoDB遇SSL证书路径错误求助
解决Azure Databricks连接MongoDB的SSL握手错误
错误核心分析
报错根源是javax.net.ssl.SSLHandshakeException: PKIX path building failed,说明Java运行环境的信任库中没有MongoDB服务器证书的有效验证路径。你虽添加了跳过证书验证的参数,但因格式错误或参数兼容性问题未生效,最终导致连接超时。
方案1:修正连接字符串的格式与参数
你的连接字符串存在中文引号、多余空格、参数冗余等问题,按以下标准调整:
- 替换所有中文引号为英文单引号/双引号
- 确保URL以
mongodb://开头,用户名密码格式为<Username>:<Password>,主机地址无多余空格 - 使用
tlsInsecure=true替代分散的tlsAllowInvalidCertificates、tlsAllowInvalidHostnames等参数,该参数会同时禁用证书有效性验证和主机名检查,适配MongoDB 3.x+驱动
调整后的连接字符串示例:
connectionString = 'mongodb://<Username>:<Password>@sopt-bo-halo-01.northeurope.cloudapp.azure.com:27017,sopt-bo-halo-02.northeurope.cloudapp.azure.com:27017,sopt-bo-halo-03.northeurope.cloudapp.azure.com:27017/defaultdb?ssl=true&readPreference=primary&maxIdleTimeMS=60000&connectTimeoutMS=10000&authSource=DBNAME&authMechanism=SCRAM-SHA-1&tlsInsecure=true'
方案2:匹配Mongo Spark Connector与Databricks版本
你当前使用的org.mongodb.spark:mongo-spark-connector_2.12:3.0.1需要与Databricks的Spark版本严格兼容:
- Databricks 9.0+(Spark 3.1.x)对应Connector 3.0.x系列
- Databricks 10.x+(Spark 3.2.x)推荐使用
org.mongodb.spark:mongo-spark-connector_2.12:3.2.2
修改SparkSession配置中的spark.jars.packages参数即可完成版本适配。
方案3:导入CA证书到信任库(生产环境首选)
如果生产环境不允许跳过证书验证,需将MongoDB的CA证书导入到Databricks的Java信任库:
- 将CA证书文件(如
mongo-ca.crt)上传到DBFS路径,例如dbfs:/mnt/certs/mongo-ca.crt - 使用
keytool命令将CRT证书转换为JKS格式的信任库:
keytool -importcert -file mongo-ca.crt -keystore mongo-truststore.jks -alias mongo-ca
- 在SparkSession配置中添加信任库参数:
spark = SparkSession.builder\ .appName("MongoSparkConnectorIntro")\ .config('spark.mongodb.input.uri', connectionString)\ .config('spark.mongodb.output.uri', connectionString)\ .config('spark.jars.packages', 'org.mongodb.spark:mongo-spark-connector_2.12:3.2.2')\ .config('spark.driver.extraJavaOptions', '-Djavax.net.ssl.trustStore=/dbfs/mnt/certs/mongo-truststore.jks -Djavax.net.ssl.trustStorePassword=your-truststore-password')\ .config('spark.executor.extraJavaOptions', '-Djavax.net.ssl.trustStore=/dbfs/mnt/certs/mongo-truststore.jks -Djavax.net.ssl.trustStorePassword=your-truststore-password')\ .getOrCreate()
内容的提问来源于stack exchange,提问作者Rittik De
相关产品推荐
相关产品推荐

