我正在使用pyspark从google云存储桶中读取parquet文件。一切都很好,直到我试图从不同的桶- 3文件获取数据。当读取第三个文件时,我得到:
所致:com.amazonaws.services.s3.model。AmazonS3 exception: Forbidden (Service: AmazonS3;状态码:403;错误码:403禁止;请求ID: null;S3扩展请求ID: null), S3扩展请求ID: null
如果我改变我正在读取的文件的顺序(例如第三个是第一个),所有工作都很好。
我的火花设置:
spark_session.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.access.key", configuration.user)
spark_session.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.secret.key", configuration.password)
spark_session.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.endpoint", configuration.endpoint)
spark_session.sparkContext._jsc.hadoopConfiguration().set(
"fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem"
)
spark_session.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.path.style.access", "true")
我正在使用:hadoop-aws-3.2.0.jaraws-java-sdk-bundle-1.11.704.jarspark-hadoop-cloud_2.13-3.2.0.jar
是的,我找到了解决方案。我错误地将bucket访问设置为:
spark_session.sparkContext._jsc.hadoopConfiguration().set(f"fs.s3a.bucket.{bucket_name}.endpoint", configuration.endpoint)
spark_session.sparkContext._jsc.hadoopConfiguration().set(f"fs.s3a.bucket.{bucket_name}.access.key", configuration.user)
spark_session.sparkContext._jsc.hadoopConfiguration().set(f"fs.s3a.bucket.{bucket_name}.secret.key", configuration.password)
孩子们,记住,8小时的调试可以节省0.5小时的阅读文档的时间。
使用Per-Bucket Configuration配置不同的S3桶使用不同的S3A客户端配置可以访问不同的S3桶。这允许使用不同的端点、数据读写策略以及登录细节。fs。除了一小组不可修改的值(目前是fss . S3a .impl)之外,S3a选项可以在每个bucket的基础上进行设置。通过替换fs.s3a来设置桶特定选项。使用fs.s3a.bucket.BUCKETNAME在选项上添加前缀。,其中BUCKETNAME是桶的名称。当连接到bucket时,所有显式设置的选项将覆盖基本的fs.s3a。值。
https://hadoop.apache.org/docs/current/hadoop-aws/tools/hadoop-aws/index.html Storing_secrets_with_Hadoop_Credential_Providers