Spark读取本地部署S3兼容对象存储文件时报UnsupportedOperationException异常
错误根因
你已经正确配置了S3AFileSystem的相关参数,但读取路径使用了https://前缀,导致Hadoop没有匹配到S3A文件系统实现,反而调用了默认的HttpsFileSystem,该类没有实现listStatus方法,直接抛出了UnsupportedOperationException,和你使用read.text还是read.csv的读取方式无关。
修复方案
- 修改路径格式,将
https://前缀替换为s3a:// - 新增S3 endpoint的配置项,把原来路径里的域名挪到配置中
- 注意S3A路径的标准格式为
s3a://<bucket名称>/<对象路径>
修正后完整代码
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("s3reader") \ .getOrCreate() sc = spark.sparkContext sc._jsc.hadoopConfiguration().set("fs.s3a.path.style.access", "true") sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") sc._jsc.hadoopConfiguration().set("fs.s3a.access.key","xxxxxxxxxxxx") sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", "xxxxxxxxxxxxxx") sc._jsc.hadoopConfiguration().set("fs.s3a.connection.ssl.enabled", "true") # 新增endpoint配置,替换为你实际的S3服务域名 sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3a.us-east-1.xxxx.xxxx.xxxx.com") # 路径修改为s3a前缀,bronze为bucket名称 df = spark.read.text("s3a://bronze/xxxxxxx/test.txt") print(df)
额外注意事项
- 请确保你的Spark运行环境中已经放置了和Hadoop版本匹配的
hadoop-aws、aws-java-sdk依赖包,否则会触发S3AFileSystem类找不到的错误 - 如果你的私有S3服务使用自签名SSL证书,需要额外配置
fs.s3a.connection.ssl.enabled为false,或者将证书导入JVM信任库
内容的提问来源于stack exchange,提问作者odonnry
相关产品推荐
相关产品推荐

