Docker中PySpark读取S3遇SSLPeerUnverifiedException及依赖问题求助
解决PySpark读取S3时SSLPeerUnverifiedException证书SAN不匹配问题
问题背景
在基于python:3.9-slim-buster的Docker容器中运行PySpark 3.3.1任务,已添加hadoop-aws:3.3.1、aws-java-sdk-bundle:1.11.901依赖JAR,配置S3访问密钥及endpoint为s3.amazonaws.com,但读取s3a://sample.datasets时抛出SSLPeerUnverifiedException,提示<sample.datasets.s3.amazonaws.com>的证书与主题备用名称不匹配。
可行解决方案
1. 强制使用路径样式访问
S3虚拟主机格式(bucket.s3.amazonaws.com)会触发证书匹配问题,切换为路径样式访问可直接规避。在PySpark脚本中添加以下配置:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("S3ReadTask") \ .config("spark.hadoop.fs.s3a.path.style.access", "true") \ .config("spark.hadoop.fs.s3a.endpoint", "s3.amazonaws.com") \ .config("spark.hadoop.fs.s3a.access.key", "YOUR_ACCESS_KEY") \ .config("spark.hadoop.fs.s3a.secret.key", "YOUR_SECRET_KEY") \ .getOrCreate()
路径样式会将请求改为https://s3.amazonaws.com/sample.datasets/xxx,与证书的主题备用名称完全匹配。
2. 修正Hadoop AWS依赖版本兼容性
PySpark 3.3.1对应的官方Hadoop版本为3.3.2,而非3.3.1,版本不匹配会导致底层SSL逻辑异常。替换为兼容的JAR包:
- 更换
hadoop-aws版本为3.3.2 aws-java-sdk-bundle:1.11.901仍可兼容,若问题持续,可尝试升级至1.11.1026(Hadoop 3.3.2推荐配套版本)
3. 更新容器内CA证书
Debian slim镜像默认CA证书可能不全,导致无法正常验证S3的SSL证书。在Dockerfile中添加证书更新步骤:
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && update-ca-certificates
4. 临时禁用SSL验证(仅测试环境)
若以上方法均无效,且处于测试环境,可临时关闭SSL证书验证(生产环境禁止使用):
spark = SparkSession.builder \ .appName("S3ReadTask") \ .config("spark.hadoop.fs.s3a.connection.ssl.enabled", "false") \ .getOrCreate()
内容的提问来源于stack exchange,提问作者rishab ajain445
相关产品推荐
相关产品推荐

