1

我希望我的 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 ) 提供,我收到以下错误:

dosBucketExist on my-bucket-name:com.amazonaws.AmazonClientException:BasicAWSCredentialsProvider EnvironmentVariableCredentialsProvider SharedInstanceProfileCredentialsProvider 没有提供 AWS 凭证:com.amazonaws.SdkClientException:无法从服务端点加载凭证

还尝试将配置文件作为 JVM 选项 ( -Daws.profile=my-profile) 提供,但没有成功。

谢谢阅读。

4

2 回答 2

2

解决方案是提供 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

于 2021-04-26T13:20:17.017 回答
0

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

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

查看这篇文章和 Hadoop文档以获取更多信息。

于 2021-07-19T15:59:52.840 回答