Amazon s3 Pyspark未使用临时AWSCredentialsProvider

Amazon s3 Pyspark未使用临时AWSCredentialsProvider,amazon-s3,pyspark,Amazon S3,Pyspark,我正在尝试使用临时会话凭据使用Pyspark从S3读取文件,但不断出现错误: Received error response: com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 403, AWS Service: null, AWS Request ID: XXXXXXXX, AWS Error Code: null, AWS Error Message: Forbidden, S3 Extended Request

我正在尝试使用临时会话凭据使用Pyspark从S3读取文件,但不断出现错误:

Received error response: com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 403, AWS Service: null, AWS Request ID: XXXXXXXX, AWS Error Code: null, AWS Error Message: Forbidden, S3 Extended Request ID: XXXXXXX
我认为问题可能在于,S3A连接需要使用
org.apache.hadoop.fs.S3A.TemporaryAWSCredentialsProvider
,以便除了标准访问密钥和密钥之外,还拉入会话令牌,但即使设置了
fs.S3A.aws.credentials.provider
配置变量,它仍在尝试使用
BasicawCredentialsProvider
进行身份验证。查看日志,我看到:

DEBUG AWSCredentialsProviderChain:105 - Loading credentials from BasicAWSCredentialsProvider
我按照说明添加了必要的配置值,但它们似乎没有任何区别。下面是我用来设置它的代码:

import os
import sys
import pyspark
from pyspark.sql import SQLContext
from pyspark.context import SparkContext

os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.amazonaws:aws-java-sdk-pom:1.11.83,org.apache.hadoop:hadoop-aws:2.7.3 pyspark-shell'

sc = SparkContext()
sc.setLogLevel("DEBUG")
sc._jsc.hadoopConfiguration().set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider")
sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", os.environ.get("AWS_ACCESS_KEY_ID"))
sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", os.environ.get("AWS_SECRET_ACCESS_KEY"))
sc._jsc.hadoopConfiguration().set("fs.s3a.session.token", os.environ.get("AWS_SESSION_TOKEN"))
sql_context = SQLContext(sc)

为什么没有使用
TemporaryAWSCredentialsProvider

您使用的是哪个Hadoop版本


S3A STS支持在Hadoop 2.8.0中,这正是我在Hadoop 2.7中得到的错误消息。

Wafle是正确的,它只有2.8+版本

但是您可能可以通过设置AWS_uu环境变量而不受影响,并且可以通过这种方式获取会话机密,因为AWS环境变量支持长期存在,我认为它将获取
AWS_u会话\u令牌


请参见

我只是在不使用Hadoop的情况下运行Spark,并引入Hadoop依赖项以与S3交互,这可能是问题的一部分。我更新了我的包以使用hadoop aws:2.8.0,但从org.apache.hadoop.fs.s3a.S3AInstrumentation类中得到错误
java.lang.IllegalAccessError:试图访问方法org.apache.hadoop.metrics2.lib.MutableCounterLong.(Lorg/apache/hadoop/metrics2/MetricsInfo;J)。阅读让我觉得我需要设置
extraClassPath
值,但我不确定如何正确设置。您还需要使用匹配的hadoop通用版本。hadoop aws jar正在尝试访问旧版本中不存在的方法。这个问题是如何解决的?我还不能让它工作。我认为wafle的反应是正确的,但它仍然不能与我的配置一起工作。如果我能解决这个问题,我会多玩玩一下,然后在这里发布。core-site.xml中的setup变量并将文件复制到spark conf文件夹中。使用上面的setup2.8对我来说似乎可以做到这一点。我在没有Hadoop的情况下使用Spark安装,然后将Spark DIST类路径指向Hadoop类路径,并在PYSPARK_SUBMIT_参数中使用org.apache.Hadoop:Hadoop aws:2.8.4。