You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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强制切换到这种模式。

具体解决方案

  1. 添加路径模式访问配置
    在你的Hadoop配置中新增以下参数,强制S3A客户端使用路径模式:
hadoopConf.set("fs.s3a.path.style.access", "true")

这个配置会让请求地址变成https://abc.domain.com/bucketname/filename.json,而不是去解析不存在的bucketname.abc.domain.com。

  1. 优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:09:06