PySpark3.2+Hadoop3.3.1使用S3FS执行spark.read.load()挂起问题求助
PySpark 3.x 对接S3A 无挂起可用配置
优先推荐方案(适配PySpark3.2 + Hadoop3.3.1环境)
你遇到的无限挂起核心原因是endpoint配置错误、Spark上下文构建顺序冲突,metrics文件的警告不影响核心逻辑,不需要处理。
下面是经过验证的可运行配置:
import os from pyspark.sql import SparkSession # 环境变量写在最前面 os.environ['AWS_ACCESS_KEY_ID'] = '你的AK' os.environ['AWS_SECRET_ACCESS_KEY'] = '你的SK' # 统一用SparkSession.builder构建,避免上下文冲突 spark = SparkSession.builder \ .appName('s3_test') \ .config('spark.jars.packages', 'org.apache.hadoop:hadoop-aws:3.3.1,com.amazonaws:aws-java-sdk-bundle:1.11.901') \ .getOrCreate() # Hadoop配置 hadoop_conf = spark._jsc.hadoopConfiguration() hadoop_conf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") hadoop_conf.set("fs.s3a.aws.credentials.provider", "com.amazonaws.auth.EnvironmentVariableCredentialsProvider") # 注意endpoint必须加https前缀,补全s3前缀 hadoop_conf.set("fs.s3a.endpoint", "https://s3.us-east-1.amazonaws.com") # 可选:添加超时配置,避免无限挂起,出问题直接抛出超时错误方便排查 hadoop_conf.set("fs.s3a.connection.timeout", "10000") hadoop_conf.set("fs.s3a.socket.timeout", "20000") hadoop_conf.set("fs.s3a.attempts.maximum", "3") # 测试读取 df = spark.read.format('csv').option('header', 'true').load('s3a://你的bucket/你的文件.csv') print(df.count()) df.show()
常见问题排查点
- 如果你要使用
spark-hadoop-cloud包,必须匹配你PySpark编译对应的Scala版本:绝大多数PySpark3.2官方发行版默认使用Scala2.12编译,你之前用_2.13后缀的包会发生依赖冲突,正确依赖应为org.apache.spark:spark-hadoop-cloud_2.12:3.2.0 - 不要混合声明hadoop-aws和spark-hadoop-cloud依赖,二者选其一即可
- 如果没有版本绑定要求,可切换到更稳定的生产级组合:Spark3.1.3 + Hadoop3.2,对应依赖为
org.apache.hadoop:hadoop-aws:3.2.4,com.amazonaws:aws-java-sdk-bundle:1.11.563,兼容性问题更少
内容的提问来源于stack exchange,提问作者zyd
相关产品推荐
相关产品推荐

