PySpark读取西部数据内部S3 JSON文件遇UnknownHostException错误求助
解决PySpark读取内部S3存储JSON文件时的UnknownHostException错误
从你的报错栈能看到核心问题:S3A客户端默认用虚拟主机模式(virtual-host-style)访问你的内部存储,把bucket名拼在endpoint域名前生成了bucketname.abc.domain.com,但这个域名根本不存在,导致DNS解析失败。
西部数据这类私有S3兼容存储,通常默认用**路径模式(path-style)**访问——也就是把bucket名作为URL路径的一部分,而不是域名前缀。你需要显式配置Hadoop强制切换到这种模式。
具体解决方案
- 添加路径模式访问配置
在你的Hadoop配置中新增以下参数,强制S3A客户端使用路径模式:
hadoopConf.set("fs.s3a.path.style.access", "true")
这个配置会让请求地址变成https://abc.domain.com/bucketname/filename.json,而不是去解析不存在的bucketname.abc.domain.com。
- 优化Spark初始化方式
建议显式创建SparkSession(Spark 2.0+推荐用法),替代旧版的sqlContext,代码逻辑会更清晰。
修改后的完整代码
import os os.environ['PYSPARK_SUBMIT_ARGS'] = "--packages=org.apache.hadoop:hadoop-aws:2.7.4 pyspark-shell" import findspark findspark.init('/root/spark/spark-3.0.0-preview-bin-hadoop2.7') from pyspark.sql import SparkSession # 显式创建SparkSession spark = SparkSession.builder.appName("S3JsonReader").getOrCreate() sc = spark.sparkContext hadoopConf = sc._jsc.hadoopConfiguration() myAccessKey = '*************' mySecretKey = '******' hadoopConf.set("fs.s3a.endpoint", "https://abc.domain.com") hadoopConf.set("fs.s3a.awsAccessKeyId", myAccessKey) hadoopConf.set("fs.s3a.awsSecretAccessKey", mySecretKey) # 关键配置:启用路径模式访问 hadoopConf.set("fs.s3a.path.style.access", "true") df = spark.read.json("s3a://bucketname/filename.json") df.show()
额外排查建议
如果添加配置后仍有问题,可以:
- 用
curl https://abc.domain.com/bucketname/filename.json测试网络是否能正常访问目标文件 - 确认你的hadoop-aws版本(2.7.4)和Spark 3.0.0-preview的兼容性(两者是兼容的,但如果后续有其他异常,可以考虑升级到匹配的Hadoop版本)
内容的提问来源于stack exchange,提问作者user5499459
相关产品推荐
相关产品推荐

