Apache spark 使用Spark读取S3文件时提供AWS_配置文件

Apache spark 使用Spark读取S3文件时提供AWS_配置文件,apache-spark,hadoop,amazon-s3,profile,aws-credentials,Apache Spark,Hadoop,Amazon S3,Profile,Aws Credentials,我希望我的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读

我希望我的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读取这些文件时,使用作为env变量提供的aws_配置文件(aws_配置文件),我得到了以下错误:

DoesBucket存在于我的bucket名称中:com.amazonaws.AmazonClientException:BasicAWSCredentialsProvider环境变量CredentialsProvider SharedInstanceProfileCredentialsProvider:com.amazonaws.sdkClientxception:无法从服务端点加载凭据

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


感谢阅读。

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