8

我正在尝试从 Spark 读取 s3 存储桶,直到今天 Spark 总是抱怨请求返回 403

hadoopConf = spark_context._jsc.hadoopConfiguration()
hadoopConf.set("fs.s3a.access.key", "ACCESSKEY")
hadoopConf.set("fs.s3a.secret.key", "SECRETKEY")
hadoopConf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
logs = spark_context.textFile("s3a://mybucket/logs/*)

Spark 说....无效的访问密钥 [ACCESSKEY]

但是,使用相同的 ACCESSKEY 和 SECRETKEY 这与 aws-cli 一起使用

aws s3 ls mybucket/logs/

在python boto3中这是有效的

resource = boto3.resource("s3", region_name="us-east-1")
resource.Object("mybucket", "logs/text.py") \
            .put(Body=open("text.py", "rb"),ContentType="text/x-py")

所以我的凭据无效,问题肯定是 Spark 的问题。

今天我决定打开整个 Spark 的“DEBUG”日志,令我惊讶的是……Spark 没有使用我提供的 [SECRETKEY] 而是……添加一个随机的???

17/03/08 10:40:04 调试请求:发送请求:HEAD https://mybucket.s3.amazonaws.com / 标头:(授权:AWS ACCESSKEY:[RANDON-SECRET-KEY],用户代理:aws -sdk-java/1.7.4 Mac_OS_X/10.11.6 Java_HotSpot(TM)_64-Bit_Server_VM/25.65-b01/1.8.0_65,日期:2017 年 3 月 8 日星期三 10:40:04 GMT,内容类型:application/x -www-form-urlencoded; charset=utf-8, )

这就是为什么它仍然返回 403!Spark 没有使用我通过 fs.s3a.secret.key 提供的密钥,而是发明了一个随机密钥?

作为记录,我正在使用此命令在我的机器(OSX)上本地运行它

spark-submit --packages com.amazonaws:aws-java-sdk-pom:1.11.98,org.apache.hadoop:hadoop-aws:2.7.3 test.py

有人可以启发我吗?

4

4 回答 4

2

(更新为我原来的一个被否决,因为显然被认为是不可接受的)

AWS 身份验证协议不会通过网络发送您的密钥。它签署消息。这就是为什么你看到的不是你输入的。

如需更多信息,请重新阅读。

于 2017-03-08T12:18:12.197 回答
2

我遇到了类似的问题。使用有效 AWS 凭证的请求返回 403 Forbidden,但仅在某些机器上。最终我发现那些特定机器上的系统时间落后了 10 分钟。同步系统时钟解决了这个问题。

希望这可以帮助!

于 2017-11-29T21:58:59.663 回答
1

这个随机密钥非常有趣。也许 AWS SDK 正在从操作系统环境中获取密码。

在 hadoop 2.8 中,默认的 AWS 供应商链显示以下供应商列表:

BasicAWSCredentialsProvider EnvironmentVariableCredentialsProvider SharedInstanceProfileCredentialsProvider

订单当然很重要!AWSCredentialProviderChain,从提供该信息的第一个提供商处获取第一个密钥。

            if (credentials.getAWSAccessKeyId() != null &&
                credentials.getAWSSecretKey() != null) {
                log.debug("Loading credentials from " + provider.toString());
                lastUsedProvider = provider;
                return credentials;
            } 

请参阅“AWSCredentialProviderChain 的 GrepCode”中的代码。

我使用个人资料凭据面临类似的问题。SDK 忽略了 ~/.aws/credentials 中的凭据(作为一种好的做法,我鼓励您不要以任何方式将凭据存储在程序中)。

我的解决方案...

将凭据提供程序设置为使用 ProfileCredentialsProvider

sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3.eu-central-1.amazonaws.com") # yes, I am using central eu server.
sc._jsc.hadoopConfiguration().set('fs.s3a.aws.credentials.provider', 'com.amazonaws.auth.profile.ProfileCredentialsProvider')
于 2017-05-11T08:52:16.087 回答
0

伙计们,选择基于角色的 IAM 配置……这将打开 S3 访问策略,应该添加到 EMR 默认策略中。

于 2021-04-20T17:18:40.057 回答