Spark查询Ceph集群报错:无法执行HTTP请求,SSL消息不被识别
问题排查方案
1. 对齐PySpark与boto3核心配置
boto3能正常访问Ceph,说明密钥、端点、区域等核心参数有效,先逐一核对PySpark的S3兼容配置是否与boto3完全一致:
- 确认
spark.hadoop.fs.s3a.endpoint与boto3的endpoint_url完全匹配(包含http/https协议、端口号,注意末尾不要加多余斜杠) - 检查
spark.hadoop.fs.s3a.access.key、spark.hadoop.fs.s3a.secret.key是否和boto3的aws_access_key_id、aws_secret_access_key完全一致,避免大小写错误或空格
2. 针对不同端口报错的具体修复
端口6800:SSL消息不支持/无法识别
该报错说明协议不匹配:若boto3用http://x.x.x.x:6800访问明文端口,需在PySpark中关闭SSL:spark.hadoop.fs.s3a.connection.ssl.enabled false若boto3用HTTPS访问,需确认Ceph 6800端口已配置SSL证书,并在PySpark中开启SSL+指定信任证书路径(自签证书场景):
spark.hadoop.fs.s3a.connection.ssl.enabled true spark.hadoop.fs.s3a.connection.ssl.trust-store.path /path/to/ca.crt端口443:403权限禁止
排除密钥问题(boto3已验证有效),重点排查:- 开启路径式访问:Ceph默认需要路径式而非虚拟主机式访问,添加配置
spark.hadoop.fs.s3a.path.style.access true - 核对代理配置:服务器C的远程环境可能给PySpark设置了代理,但boto3未走代理,对比两者的
HTTP_PROXY/HTTPS_PROXY环境变量
- 开启路径式访问:Ceph默认需要路径式而非虚拟主机式访问,添加配置
端口1:连接被拒绝
该端口明显异常,说明PySpark的端点配置有误,大概率是配置项拼写错误(比如把endpoint写成错误键名),导致Spark读取了错误的默认端口,仔细核对所有Spark配置项的键名拼写。
3. 检查Spark S3A依赖版本兼容性
不同版本的Hadoop S3A客户端与Ceph RGW兼容性差异较大:
- 若Ceph为新版本,建议使用Hadoop 3.3+版本的S3A客户端
- 提交任务时可指定兼容依赖:
spark-submit --packages org.apache.hadoop:hadoop-aws:3.3.4,com.amazonaws:aws-java-sdk-bundle:1.12.262 your_script.py
4. 开启调试日志定位差异
在PySpark代码中添加调试日志,对比boto3的请求细节:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("CephTest") \ .config("spark.hadoop.fs.s3a.endpoint", "http://your-ceph-endpoint:6800") \ .config("spark.hadoop.fs.s3a.access.key", "your-key") \ .config("spark.hadoop.fs.s3a.secret.key", "your-secret") \ .config("spark.hadoop.fs.s3a.path.style.access", "true") \ .config("spark.hadoop.fs.s3a.connection.ssl.enabled", "false") \ .config("spark.log.level", "DEBUG") \ .getOrCreate() df = spark.read.text("s3a://your-bucket/test.txt") df.show()
查看日志中的请求URL、头信息,与boto3的请求日志(开启botocore.endpoint日志)对比,定位配置或请求逻辑的差异。
内容的提问来源于stack exchange,提问作者pioneeringwork
相关产品推荐
相关产品推荐

