使用 Spark 读取 S3 文件时提供 AWS_PROFILE

问题描述 投票:0回答:3

我希望我的 Spark 应用程序 (Scala) 能够读取 S3 文件

spark.read.parquet("s3://my-bucket-name/my-object-key")

在我的开发机器上,我可以使用 awscli 访问 S3 文件,这是

~/.aws/config
~/.aws/credentials
中预先配置的配置文件,例如:

aws --profile my-profile s3 ls s3://my-bucket-name/my-object-key

但是当尝试从 Spark 读取这些文件时,并使用作为环境变量提供的 aws_profile (AWS_PROFILE),我收到以下错误:

我的存储桶名称上的 doesBucketExist:com.amazonaws.AmazonClientException:BasicAWSCredentialsProvider 没有提供 AWS 凭证 EnvironmentVariableCredentialsProvider SharedInstanceProfileCredentialsProvider:com.amazonaws.SdkClientException:无法从服务端点加载凭证

还尝试提供配置文件作为 JVM 选项 (

-Daws.profile=my-profile
),但没有成功。

感谢您的阅读。

apache-spark hadoop amazon-s3 profile aws-credentials
3个回答
4
投票

解决方案是提供spark属性:

fs.s3a.aws.credentials.provider
,将其设置为
com.amazonaws.auth.profile.ProfileCredentialsProvider
。 如果我可以更改代码来构建 Spark 会话,那么就像:

SparkSession
    .builder()
    .config("fs.s3a.aws.credentials.provider","com.amazonaws.auth.profile.ProfileCredentialsProvider")
    .getOrCreate()

另一种方法是提供 JVM 选项

-Dspark.hadoop.fs.s3a.aws.credentials.provider=com.amazonaws.auth.profile.ProfileCredentialsProvider

*注意前缀
spark.hadoop


0
投票

如果将

fs.s3a.aws.credentials.provider
设置为
com.amazonaws.auth.profile.ProfileCredentialsProvider
并正确设置
AWS_PROFILE
后仍然出现问题,可能是因为您使用的是Hadoop 2,不支持上述配置。

因此,我找到的唯一解决方法是升级到 Hadoop 3。

查看 这篇文章 和 Hadoop docs 了解更多信息。


0
投票

我有两个与 Spark+AWS 兼容性相关的问题。

首先,pyspark 没有看到

~/.aws/config
文件中指定的配置文件。我必须将其移至
~/.aws/credentials
,以便 Spark 至少承认该配置文件存在。至少从
jupyter
内部并使用
pyspark

更重要的是,sso/身份服务器是从本地计算机访问 AWS 的推荐方式,但

s3a
连接链不支持基于 sso 的身份验证设置。在另一个问题的答案中对此进行了解释。

© www.soinside.com 2019 - 2024. All rights reserved.