Spark集成Delta Lake依赖解析失败(SSL证书问题)求助
问题描述
在S3环境下使用Spark,采用Parquet格式并通过Delta Lake管理数据,Spark与S3连接已正常,但Python集成Delta Lake时出现依赖解析失败,错误信息如下:
---------------------------------------------------------------------------------- > :::::::::::::::::::::::::::::::::::::::::::::: > > :: UNRESOLVED DEPENDENCIES :: > > :::::::::::::::::::::::::::::::::::::::::::::: > > :: io.delta#delta-core_2.12;2.2.0: not found > > :::::::::::::::::::::::::::::::::::::::::::::: > > > :::: ERRORS > Server access error at url https://repo1.maven.org/maven2/io/delta/delta-core_2.12/2.2.0/delta-core_2.12-2.2.0.pom > (javax.net.ssl.SSLException: Unexpected error: > java.security.InvalidAlgorithmParameterException: the trustAnchors > parameter must be non-empty) > > Server access error at url https://repo1.maven.org/maven2/io/delta/delta-core_2.12/2.2.0/delta-core_2.12-2.2.0.jar > (javax.net.ssl.SSLException: Unexpected error: > java.security.InvalidAlgorithmParameterException: the trustAnchors > parameter must be non-empty) > > Server access error at url https://repos.spark-packages.org/io/delta/delta-core_2.12/2.2.0/delta-core_2.12-2.2.0.pom (javax.net.ssl.SSLException: Unexpected error: > java.security.InvalidAlgorithmParameterException: the trustAnchors > parameter must be non-empty) > > Server access error at url https://repos.spark-packages.org/io/delta/delta-core_2.12/2.2.0/delta-core_2.12-2.2.0.jar (javax.net.ssl.SSLException: Unexpected error: > java.security.InvalidAlgorithmParameterException: the trustAnchors > parameter must be non-empty) > > ---------------------------------------------------------------------------
已知错误与Maven/Spark仓库的HTTPS SSL证书有关,涉及证书路径/etc/ssl/certs/java/cacerts,已尝试重新安装OpenJDK 11、更新证书、配置Java security参数,但问题仍存在,需要排查Java是否读取正确证书目录、证书是否有效。
已尝试操作
- 重新安装openjdk-11
- 更新Java配置中的
management.properties和security设置(指定JKS格式及cacerts位置)
错误排查与解决建议
1. 确认Java实际读取的cacerts路径
执行以下命令查看当前JVM使用的java根目录:
java -XshowSettings:properties -version | grep 'java.home'
根据输出的java.home路径,对应的默认cacerts路径为${java.home}/lib/security/cacerts,检查该文件是否存在且非空:
ls -lh $(dirname $(readlink -f $(which java)))/../lib/security/cacerts
也可以通过设置JVM参数强制指定信任库路径,验证是否能正常拉取依赖:
spark-submit --conf spark.driver.extraJavaOptions="-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts -Djavax.net.ssl.trustStorePassword=changeit" --packages io.delta:delta-core_2.12:2.2.0 your_script.py
2. 验证cacerts证书有效性
检查cacerts文件是否包含Maven仓库的根证书:
keytool -list -keystore /etc/ssl/certs/java/cacerts -storepass changeit | grep -i "digicert\|verisign"
如果缺少根证书,手动导入Maven仓库的SSL证书:
- 下载证书:
openssl s_client -connect repo1.maven.org:443 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > maven.crt
- 导入到cacerts:
sudo keytool -importcert -file maven.crt -keystore /etc/ssl/certs/java/cacerts -alias maven-repo -storepass changeit -noprompt
3. 检查Java环境变量与配置优先级
确认是否存在覆盖默认信任库的环境变量:
echo $JAVA_OPTS echo $SPARK_OPTS
检查Java的security配置文件(${java.home}/lib/security/java.security)中是否有如下正确配置,避免被错误修改:
ssl.trustStoreType=JKS ssl.trustStore=/etc/ssl/certs/java/cacerts ssl.trustStorePassword=changeit
4. 临时绕过SSL验证调试(生产环境禁用)
若上述方法无效,可临时关闭SSL验证确认是否为证书问题:
spark-submit --conf spark.driver.extraJavaOptions="-Djavax.net.ssl.trustStoreType=JKS -Djavax.net.ssl.trustStore=/dev/null -Djavax.net.ssl.trustStorePassword=" --conf spark.executor.extraJavaOptions="-Djavax.net.ssl.trustStoreType=JKS -Djavax.net.ssl.trustStore=/dev/null -Djavax.net.ssl.trustStorePassword=" --packages io.delta:delta-core_2.12:2.2.0 your_script.py
内容的提问来源于stack exchange,提问作者BFR92
相关产品推荐
相关产品推荐

