PySpark配置requester-pays.enabled无法访问AWS S3请求付费存储桶
看起来你遇到了PySpark访问请求付费S3桶的典型问题,结合你提到AWS CLI加--request-payer requester就能正常访问、去掉就和PySpark报一样的错,大概率是配置参数出了问题,我来帮你梳理下解决方向:
1. 修正核心配置参数名
你目前的配置里同时写了spark.hadoop.fs.s3a.requester-pays.enabled和spark.hadoop.fs.s3a.requester.pays.enabled,这里要注意:Hadoop S3A的正确参数名是用点分隔的fs.s3a.requester.pays.enabled,带横杠的那个参数是无效的——这就是你的配置没生效的关键原因。
建议你删除所有带横杠的参数配置,只保留正确的点分隔版本。
2. 统一配置位置,避免冲突
你既在SparkSession代码里配置了参数,又在spark-submit命令里通过--conf指定了一遍。虽然spark-submit的配置优先级更高,但重复配置容易混淆。建议只在一个地方配置核心参数,比如代码里或者提交命令里,保持一致性。
3. 清理重复的依赖包
你的代码里通过spark.jars.packages指定了hadoop-aws和aws-java-sdk-bundle,同时在spark-submit的--packages里又重复指定了一次,这可能导致依赖冲突。建议只保留其中一处的依赖声明,比如去掉代码里的,只在提交命令里指定,或者反过来。
修改后的示例配置
代码中的SparkSession配置:
spark = SparkSession.builder \ .appName("MainnetBlocksStreamingJob") \ .config("spark.jars.packages", "org.apache.hadoop:hadoop-aws:3.2.0,com.amazonaws:aws-java-sdk-bundle:1.11.375") \ .config("spark.hadoop.fs.s3a.access.key", S3_ACCESS_KEY) \ .config("spark.hadoop.fs.s3a.secret.key", S3_SECRET_KEY) \ .config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \ .config("spark.hadoop.fs.s3a.requester.pays.enabled", "true") \ .config('spark.hadoop.fs.s3a.aws.credentials.provider', 'org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider')\ .getOrCreate()
对应的spark-submit命令:
spark-submit \ --packages io.delta:delta-spark_2.12:3.3.0,org.apache.hadoop:hadoop-aws:3.2.0,com.amazonaws:aws-java-sdk-bundle:1.11.375 \ --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \ --conf spark.hadoop.fs.s3a.requester.pays.enabled=true \ dataproc_jobs/streaming.py
额外排查建议
如果修改后还是不行,可以开启S3A的调试日志,查看请求细节:在log4j.properties里添加以下配置,这样能看到PySpark和S3交互的具体日志,帮你定位是否请求真的带上了请求者付费的标识:
log4j.logger.org.apache.hadoop.fs.s3a=DEBUG
备注:内容来源于stack exchange,提问作者Edward Chew

